2016-09-23 151 views

回答

0

TypeScript完全是编译端;所有静态类型在转换为JavaScript时都会丢失。尽管没有理由做这样的事情阻止你:

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

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

这是正确的,但该代码抛出一个编译错误严格空检查虽然 - “类型未定义不可分配给类型字符串。”它不会绕过类型检查器。 –

6

为空性/ undefinedness检查只是在如何式系统模型类型的变化。像往常一样,这一切都发生在类型检查阶段,并且在发射的JavaScript中没有任何东西在运行时强制执行。

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

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

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

在打字稿严格的空检查,nullundefined搬出所有类型的域,并转化为自己的类型。现在,价值null不能用于string预期的地方,因为它不再位于string的域中。 string | null现在代表的值可能是string的某些成员的特殊值null

这个解释是从Anders Hejlsberg's talk from Build 2016 starting around 44:30改编而来的,正如你可能想象的那样,他比我更擅长解释它,尤其是因为他有一些很好的幻灯片陪伴它。

相关问题