首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >type Typescript方法返回与其声明的返回类型不同的值?

type Typescript方法返回与其声明的返回类型不同的值?
EN

Stack Overflow用户
提问于 2022-03-13 06:06:16
回答 1查看 49关注 0票数 0

我的印象是,如果声明了一个具有某种返回类型的方法,它只会返回该类型的结果。但情况似乎并非如此。

如果将以下代码粘贴到类型记录操场中,则从console.log(f.count)获得的结果是"5"console.log(paramType)返回string

的确,您必须将noImplicit any设置为false,以使用语法this[propName] =设置属性,但对于一种以强类型声明为number的方法返回字符串的语言来说,这似乎很奇怪。当将字符串赋值给声明为number的变量时,我可能会在运行时得到某种错误。同样令人惊讶的是,声明为number的方法正在返回一个string

对这种行为的解释是什么?

代码语言:javascript
运行
复制
class foo {
    private _count: number = 0;
    get count(): number {
        return this._count;
    }
    set count(value: number) {
        this._count = value;
    }
    setValue(val: string) {
        let prop = "count"
        this[prop] = val;
    }
}

let f = new foo();
f.setValue("5")
console.log(f.count);    //"5"
let paramtype = typeof (f.count);    

console.log(paramtype)  //"string"
EN

Stack Overflow用户

发布于 2022-03-13 06:21:17

从某种意义上说,你是在背后扭曲打字本的手,迫使它丢失这部分的类型信息:

代码语言:javascript
运行
复制
    setValue(val: string) {
        let prop = "count"
        this[prop] = val;
    }

this[prop]any类型,这意味着您可以为其分配任何,包括该特定属性的“错误”类型。

TypeScript不会在生成的JavaScript中发出运行时检查。

因此,您不会收到任何运行时错误。

TL; TypeScript博士只有在你允许的范围内才是安全和严格的。在这里,您已经完成了在TypeScript中可能出现的最糟糕的事情,并使用了隐式any类型。看看结果是什么!关于类的API的不安全和不安全的保证。

这就是为什么noImplicitAny是你应该经常使用的标志

编辑:我在理解原因时遗漏了一个重要的细节。这里的propstring类型的。访问this上的任何属性都会在any中产生结果,因为如果它可以是任何属性,那么您如何知道它是什么类型?因为这是any,TypeScript不再关心了。你可以用它做任何你想做的事,这就是为什么这会发生。要避免这种情况,请将prop设置为文字类型"count"as const

代码语言:javascript
运行
复制
let prop = "count" as const;

或者地狱,只需使用const来声明它:

代码语言:javascript
运行
复制
const prop = "count";

您会发现,TypeScript现在正确地将this[prop]看作是this.count,并在错误地分配它的位置出现错误:)

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71454267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档