Typescript 2如何强制执行不可为空的类型?

时间:2016-09-23 00:15:32

标签: javascript typescript static-typing typescript2.0

我知道一般的解释是编译器执行静态类型检查,但编译器使用哪些方法来验证没有可空类型意外发挥作用?

2 个答案:

答案 0 :(得分:6)

可空性/不确定性检查只是类型系统模型类型的变化。像往常一样,这一切都发生在类型检查阶段,并且发出的JavaScript中没有任何内容可以在运行时强制执行此操作。

无论如何,您可以将类型视为域值。例如,boolean的域通常只是两个值truefalsestring是一个无界域,其中包含"hello""world"等字符串以及其他所有字符串。

TypeScript会检查在某个类型的位置使用某个值时,该值是否属于该类型的域。例如,true不在number的域中,因此尝试使用期望true的{​​{1}}是违法的。

在没有严格空检查的TypeScript中,numbernull 属于每种类型的域。因此,undefined类型实际上具有四个值:booleantruefalseundefined。正如人们通常发现的那样,这很糟糕,因为nullundefined的行为与nulltrue完全不同。对于具有属性和方法的内容,情况更糟,因为false作为substr 域中每个值的方法存在,除了 string和{{1} ,所以它真的很烦人。

在带有严格空检查的TypeScript 中,nullundefined移出所有类型的域并进入自己的类型。现在,值null无法在预期undefined的位置使用,因为它不再位于null的域中。类型string现在代表的值可能是string的某个成员或特殊值string | null

这个解释改编自Anders Hejlsberg's talk from Build 2016 starting around 44:30,正如你可能想象的那样,他比我更好地解释它,特别是因为他有一些漂亮的幻灯片陪伴它。

答案 1 :(得分:0)

TypeScript完全是编译方面;转换为JavaScript时,所有静态类型都将丢失。没有什么可以阻止你做类似的事情:

let foo: { myProperty: string } = { myProperty: "g" }; // myProperty is non-nullable

foo["myProperty"] = undefined; // bypass type checker!