繁体   English   中英

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

[英]How does Typescript 2 enforce non-nullable types?

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

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

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

TypeScript检查在某个类型位置使用值时,该值位于该类型的域中。 例如, true不在number域中,因此在预期number true下尝试使用true是非法的。

在没有严格空检查的TypeScript中, nullundefined 属于每种类型的域 所以boolean类型实际上有四个值: truefalseundefinednull 正如人们通常发现的那样,这很糟糕,因为undefinednull行为与truefalse完全不同。 对于具有属性和方法的东西,情况更糟,因为substr作为string域中除了 nullundefined 之外的每个值的方法存在,所以它真的很烦人。

具有严格空检查的TypeScript中, nullundefined移出每个类型的域并进入它们自己的类型。 现在, null值不能用在需要string位置,因为它不再位于string的域中。 类型string | null string | null现在表示一个值,该值可能是string域的某个成员特殊值null

这个解释改编自Anders Hejlsberg在2016年4月30日左右开始的Build 2016演讲 ,正如你可能想象的那样,他比我更好地解释它,特别是因为他有一些漂亮的幻灯片可以伴随它。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM