从TypeScript规范:
Null类型是除Undefined类型之外的所有类型的子类型。未定义的类型是所有类型的子类型。
据此,我相信,我们可以得出结论:undefined
是null
的子类型,例如number
的子类型。我们无法将超类型分配给子类型,例如,number
不能分配给undefined
。为什么null
作为undefined
的超类型可分配给undefined
?
let x: undefined;
x = 5; // Error
let y: undefined;
y = null; // OK
答案 0 :(得分:2)
由于定义了原始TypeScript规范中的许多算法,因此非常希望子类型关系具有严格的方向性(例如,不存在不相同的S
和T
,以便{ {1}}是[{1}}的子类型,S
是T
的子类型,减去T
,总是被允许做奇怪的事情)。如果不是这种情况,你会看到一些奇怪的行为,主要是根据元素的顺序围绕数组文字的类型。
如果子类型关系允许循环,那么还会引入一些其他微妙的问题,我现在无法回忆起这些问题。联合类型的引入有效地消除了最常见的类型"算法很大程度上依赖于非圆形子类型,所以这些理论问题在当前的TypeScript版本中可能并不明显。
制作另一个子类型的确切选择几乎是任意的。