为什么TypeScript不将数字强制转换为typed属性中的字符串?
今天我遇到了一个bug,这让我四处挖掘,感到困惑。这都是由于我的假设,即当TypeScript类中的属性定义为为什么TypeScript不将数字强制转换为typed属性中的字符串?,typescript,Typescript,今天我遇到了一个bug,这让我四处挖掘,感到困惑。这都是由于我的假设,即当TypeScript类中的属性定义为string时,TypeScript将抛出错误或将另一类型转换为string表示 我希望下面的代码在类构造中抛出错误,或者参数被转换为字符串 class A { constructor(public str: string) { console.log(typeof (str)); console.log(typeof (this.str))
string
时,TypeScript将抛出错误或将另一类型转换为string
表示
我希望下面的代码在类构造中抛出错误,或者参数被转换为字符串
class A {
constructor(public str: string) {
console.log(typeof (str));
console.log(typeof (this.str));
}
t() {
return typeof (this.str);
}
}
const a: A = new A(5 as any);
const t = a.t();
// t is now 'number'!!!!
当查看生成的JavaScript时,看起来很明显这是应该发生的事情,但我认为TypeScript会更健壮,而且这个功能是经过设计的
为什么TypeScript不将我的数字类型转换为字符串?将
转换为的变量应该被认为是危险的。这是一个类型断言——您告诉Typescript编译器您比它更了解对象的类型。如果你对Typescript编译器撒谎,它不能帮助你保证程序的安全
更糟糕的是,这里使用的是any
类型,这是一种非常允许的类型。如果您强制转换到任何其他类型,包括{}
,您将得到一个编译器错误。但是。因为TypeScript在运行时不存在?不清楚你为什么做出这些假设,但它们是错误的;TS进行编译时类型检查。那么,如果类型在TypeScipt中不可信,那有什么意义呢?有点苛刻的家伙。如果使用正确并且对发生的事情有一定的了解,它们是值得信赖的,但它们并不神奇。TS类型本身不会在运行时导致类型错误或转换,并且像任何
一样使用断言会限制它们在编译时的有用性。为什么会这样呢?生成额外的运行时类型检查/转换代码超出了TS的目标,您可以从传输的JS中看到不存在任何代码。同样,TS是一个编译时类型检查工具。@span TypeScript只是一个编译时类型检查工具。这是该语言的一个基本设计选择(这有效地使它“只是JavaScript”,具有更好的身份验证时特性)。您基本上是在问TS FAQ中包含的问题: