我知道一般的解释是编译器进行静态类型检查,但是编译器具体使用哪些方法来验证没有可空类型意外起作用?
最佳答案
可空性/未定义性检查只是类型系统建模类型方式的改变。像往常一样,这一切都发生在类型检查阶段,发出的 JavaScript 中没有任何内容可以在运行时强制执行。
无论如何,您可以将类型 视为值域。例如,boolean
的域通常只有 true
和 false
这两个值。 string
是一个无限域,它包含 "hello"
和 "world"
等字符串以及所有其他字符串。
TypeScript 检查在某个类型位置使用某个值时,该值是否在该类型的域中。例如,true
不在 number
的域中,因此尝试在 number
中使用 true
是非法的> 是预期的。
在没有严格的 null 检查的 TypeScript 中,null
和 undefined
在每个类型的域中。所以 boolean
类型实际上有 四个 值:true
、false
、undefined
、和 null
。人们通常会发现,这很糟糕,因为 undefined
和 null
的行为与 true
和 false
的行为不完全相同.对于具有属性和方法的事物,情况更糟,因为 substr
作为 string
except null 域中每个值的方法存在
和 undefined
,所以真的很烦人。
在 TypeScript 严格的空检查中,null
和 undefined
移出每种类型的域并进入它们自己的类型。现在值 null
不能用在需要 string
的地方,因为它不再在 string
的域中。类型 string | null
现在代表一个值,它可能是 string
域的某个成员或特殊值 null
。
此解释改编自Anders Hejlsberg's talk from Build 2016 starting around 44:30正如您可能想象的那样,他比我解释得更好,特别是因为他有一些漂亮的幻灯片。
关于javascript - Typescript 2 如何强制执行不可为 null 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39650708/