我知道一般的解释是编译器执行静态类型检查,但编译器使用哪些方法来验证没有可空类型意外发挥作用?
答案 0 :(得分:6)
可空性/不确定性检查只是类型系统模型类型的变化。像往常一样,这一切都发生在类型检查阶段,并且发出的JavaScript中没有任何内容可以在运行时强制执行此操作。
无论如何,您可以将类型视为域值。例如,boolean
的域通常只是两个值true
和false
。 string
是一个无界域,其中包含"hello"
和"world"
等字符串以及其他所有字符串。
TypeScript会检查在某个类型的位置使用某个值时,该值是否属于该类型的域。例如,true
不在number
的域中,因此尝试使用期望true
的{{1}}是违法的。
在没有严格空检查的TypeScript中,number
和null
属于每种类型的域。因此,undefined
类型实际上具有四个值:boolean
,true
,false
和undefined
。正如人们通常发现的那样,这很糟糕,因为null
和undefined
的行为与null
和true
完全不同。对于具有属性和方法的内容,情况更糟,因为false
作为substr
域中每个值的方法存在,除了 string
和{{1} ,所以它真的很烦人。
在带有严格空检查的TypeScript 中,null
和undefined
移出所有类型的域并进入自己的类型。现在,值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!