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

从TypeScript规范:

The Null type is a subtype of all types, except the Undefined type. The undefined type is a subtype of all types.

从此,我相信,我们可以得出结论,undefined是null的子类型,例如,数字的子类型.我们不能将超类型分配给子类型,例如,number不能分配给undefined.为什么为null,而作为未定义的超类型可分配给undefined?

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

let y: undefined;
y = null; // OK

最佳答案 由于定义了原始TypeScript规范中的许多算法,因此非常希望子类型关系是严格定向的(例如,不存在不相同的S和T,使得S是T的子类型,T是子类型S,减去任何总是允许做奇怪事情的东西).如果不是这种情况,你会看到一些奇怪的行为,主要是数组文字的类型,具体取决于它们的元素顺序.

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

制作另一个子类型的确切选择几乎是随意的.

点赞