为什么TypeScript不将数字强制转换为typed属性中的字符串?

为什么TypeScript不将数字强制转换为typed属性中的字符串?,typescript,Typescript,今天我遇到了一个bug,这让我四处挖掘,感到困惑。这都是由于我的假设,即当TypeScript类中的属性定义为string时,TypeScript将抛出错误或将另一类型转换为string表示 我希望下面的代码在类构造中抛出错误,或者参数被转换为字符串 class A { constructor(public str: string) { console.log(typeof (str)); console.log(typeof (this.str))

今天我遇到了一个bug,这让我四处挖掘,感到困惑。这都是由于我的假设,即当TypeScript类中的属性定义为
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中包含的问题: