在 TypeScript 中,为什么可以将 `null` 分配给 `undefined` 类型的变量,反之亦然

Ole*_*hai 5 typescript

从打字稿规范:

Null 类型是所有类型的子类型,Undefined 类型除外。未定义类型是所有类型的子类型。

据此,我相信,我们可以得出结论,它undefined是 的一个子类型null,例如number。我们不能将超类型分配给子类型,例如,number不可分配给undefined. 为什么null,虽然是超类型 toundefined可分配给undefined

let x: undefined;
x = 5;  // Error

let y: undefined;
y = null; // OK
Run Code Online (Sandbox Code Playgroud)

Rya*_*ugh 2

由于原始 TypeScript 规范中许多算法的定义方式,非常希望子类型关系是严格定向的(例如,没有不相同的ST存在,这样S是 的子类型TT是 的子类型S,减去any总是允许做奇怪的事情)。如果不是这种情况,您会看到一些奇怪的行为,主要围绕数组文字的类型,具体取决于其元素的顺序。

如果子类型关系允许循环,还会引入一些其他微妙的问题,目前我无法具体回忆起这些问题。联合类型的引入有效地消除了严重依赖非循环子类型的“最佳常见类型”算法,因此这些理论问题在当前版本的 TypeScript 中可能并不明显。

确切选择将哪一个创建为另一个的子类型几乎是任意的。