javascript - Typescript 2 如何强制执行不可为 null 的类型?

标签 javascript typescript static-typing typescript2.0

我知道一般的解释是编译器进行静态类型检查,但是编译器具体使用哪些方法来验证没有可空类型意外起作用?

最佳答案

可空性/未定义性检查只是类型系统建模类型方式的改变。像往常一样,这一切都发生在类型检查阶段,发出的 JavaScript 中没有任何内容可以在运行时强制执行。

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

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

在没有严格的 null 检查的 TypeScript 中,nullundefined 在每个类型的域中。所以 boolean 类型实际上有 四个 值:truefalseundefined、和 null。人们通常会发现,这很糟糕,因为 undefinednull 的行为与 truefalse 的行为不完全相同.对于具有属性和方法的事物,情况更糟,因为 substr 作为 string except null 域中每个值的方法存在undefined,所以真的很烦人。

在 TypeScript 严格的空检查中,nullundefined 移出每种类型的域并进入它们自己的类型。现在值 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/

相关文章:

web-services - Angular 2 View 不显示来自 Web 服务的数据

reactjs - Flow : destructuring. React/Preact 中缺少注释

javascript - PHP/JS : cannot get

javascript - jquery:如何选择属性名称中包含数组值的复选框?

javascript - 如何在 Angular 4 规范文件中模拟 nativeElement.focus()

javascript - 在 Typescript 中,使用公共(public)字符串字段作为键从 Array<T> 构造 Map<string,T> 时出错

javascript - Angular - Map/Catch 返回相同的值但收到错误

javascript - Particles.js 没有粒子以 Angular 加载

c# - C# 和 typescript 之间 JSON 的端到端类型安全