我的印象是,如果声明了一个具有某种返回类型的方法,它只会返回该类型的结果。但情况似乎并非如此。
如果将以下代码粘贴到类型记录操场中,则从console.log(f.count)获得的结果是"5",console.log(paramType)返回string。
的确,您必须将noImplicit any设置为false,以使用语法this[propName] =设置属性,但对于一种以强类型声明为number的方法返回字符串的语言来说,这似乎很奇怪。当将字符串赋值给声明为number的变量时,我可能会在运行时得到某种错误。同样令人惊讶的是,声明为number的方法正在返回一个string。
对这种行为的解释是什么?
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"发布于 2022-03-13 06:21:17
从某种意义上说,你是在背后扭曲打字本的手,迫使它丢失这部分的类型信息:
setValue(val: string) {
let prop = "count"
this[prop] = val;
}this[prop]是any类型,这意味着您可以为其分配任何,包括该特定属性的“错误”类型。
TypeScript不会在生成的JavaScript中发出运行时检查。
因此,您不会收到任何运行时错误。
TL; TypeScript博士只有在你允许的范围内才是安全和严格的。在这里,您已经完成了在TypeScript中可能出现的最糟糕的事情,并使用了隐式any类型。看看结果是什么!关于类的API的不安全和不安全的保证。
这就是为什么noImplicitAny是你应该经常使用的标志
编辑:我在理解原因时遗漏了一个重要的细节。这里的prop是string类型的。访问this上的任何属性都会在any中产生结果,因为如果它可以是任何属性,那么您如何知道它是什么类型?因为这是any,TypeScript不再关心了。你可以用它做任何你想做的事,这就是为什么这会发生。要避免这种情况,请将prop设置为文字类型"count"和as const。
let prop = "count" as const;或者地狱,只需使用const来声明它:
const prop = "count";您会发现,TypeScript现在正确地将this[prop]看作是this.count,并在错误地分配它的位置出现错误:)
https://stackoverflow.com/questions/71454267
复制相似问题