![](/img/trans.png)
[英]Cast Flow/TypeScript JavaScript object value types to non-nullable
[英]How does Typescript 2 enforce non-nullable types?
我知道一般的解释是编译器执行静态类型检查,但编译器使用什么方法来验证没有可空类型意外发挥作用?
可空性/不确定性检查只是类型系统模型类型的变化。 像往常一样,这一切都发生在类型检查阶段,并且发出的JavaScript中没有任何内容可以在运行时强制执行此操作。
无论如何,您可以将类型视为值的域 。 例如, boolean
域通常只是两个值true
和false
。 string
是一个无界域,包含"hello"
和"world"
等字符串以及其他所有字符串。
TypeScript检查在某个类型位置使用值时,该值位于该类型的域中。 例如, true
不在number
域中,因此在预期number
true
下尝试使用true
是非法的。
在没有严格空检查的TypeScript中, null
和undefined
属于每种类型的域 。 所以boolean
类型实际上有四个值: true
, false
, undefined
和null
。 正如人们通常发现的那样,这很糟糕,因为undefined
和null
行为与true
和false
完全不同。 对于具有属性和方法的东西,情况更糟,因为substr
作为string
域中除了 null
和undefined
之外的每个值的方法存在,所以它真的很烦人。
在具有严格空检查的TypeScript中, null
和undefined
移出每个类型的域并进入它们自己的类型。 现在, 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.