【发布时间】:2019-10-28 12:52:15
【问题描述】:
我今天遇到了一个错误,导致我进行了大量的挖掘和困惑。这完全是由于我假设当 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 在运行时不存在?目前尚不清楚您为什么做出这些假设,但它们是错误的; TS 会进行编译时类型检查。
-
那么,如果类型在 TypeScipt 中不能被信任,那有什么意义呢?有点苛刻的家伙。
-
如果使用得当并且对正在发生的事情有所了解,它们是值得信赖的,但它们并不神奇。单独的 TS 类型不会在运行时导致类型错误或转换,并且使用像
as any这样的断言会限制它们在编译时的用处。 -
为什么会是一个?生成额外的运行时类型检查/强制转换代码超出了 TS 的目标,您可以从转译的 JS 中看到不存在。同样,TS 是一个编译时类型检查工具。
-
@span TypeScript 只是一个编译时类型检查器。这是该语言的基本设计选择(有效地使其“只是 JavaScript”,具有更好的 auth-time 功能)。您基本上是在问 TS FAQ 涵盖的问题:github.com/Microsoft/TypeScript/wiki/FAQ
标签: typescript