下面是一些代码,用于检查类型是否扩展了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?
答案 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
表示Cat
是Animal
,而Cat
具有与Animal
相同(或更多)的特征。另一种表达方式是猫是动物的特定版本。这也意味着可以将Cat
对象分配给类型为Animal
的变量。
在您的示例中,null
和undefined
是void
的更特定版本。顺便说一句,您的type B
也是true
。
在浏览器控制台中,运行不返回值的函数(例如console.log(123);
),它将显示undefined
。