为什么`undefined`在条件类型中扩展`void`?

时间:2019-04-04 22:29:02

标签: typescript

下面是一些代码,用于检查类型是否扩展了void。它正在与strict: true一起运行。

type ExtendsVoid<T> = T extends void ? true : false;

type A = ExtendsVoid<number>; // false
type B = ExtendsVoid<null>; // false
type C = ExtendsVoid<void>; // true
type D = ExtendsVoid<undefined>; // true?

为什么ExtendsVoid<undefined>返回true?

2 个答案:

答案 0 :(得分:1)

因为可以从声明为返回undefined的函数中返回void。 javascript代码在运行时的实际值实际上是undefined

因此,出于一致性考虑,undefined始终可分配给void

let z: void;
z = undefined; // ok

答案 1 :(得分:1)

在表达式T extends U ? X : Y中,关键字extends表示“继承自U”或“是U”。

在面向对象的编程中,声明class Cat extends Animal表示CatAnimal,而Cat具有与Animal相同(或更多)的特征。另一种表达方式是猫是动物的特定版本。这也意味着可以将Cat对象分配给类型为Animal的变量。

在您的示例中,nullundefinedvoid的更特定版本。顺便说一句,您的type B也是true

在浏览器控制台中,运行不返回值的函数(例如console.log(123);),它将显示undefined