never
类型表示那些永不存在的值的类型。特别的,never
可以是永远不反悔的函数的返回值类型,也可以是变量在类型收窄中不可能为真的类型。
never
类型具有以下特征:
never
的子类型,并且可以赋值给任何类型never
的子类型或者可以拷贝给 never
(除了 never
本身)return
语句,或者仅有表达式类型为 never
的 retur
语句,并且函数的终止点无法被执行到(按照控制流分析),则推导出的函数返回值类型是 never
never
返回值类型的函数中,所有 return
语句(如果有)表达式的值必须为 never
类型,且函数不应能执行到终止点never
类型同时也是 TypeScript 中的底层类型,下列是一些自然被分配的例子:
while(true) {}
)function foo() { throw new Error('Not Implemented') }
,foo
的返回类型是 never
)function infiniteloop(): never {while (true) {}}function error(message: string): never {throw Error('message');}function fail() {return error('Something wrong happen.');}
由于 never
是所有类型的子类型,在联合类型中它始终被省略,并且只要函数有其他返回的类型,推导出的函数返回值类型中就会忽略它。
因为 never
可以赋值给任何类型,返回 never
的函数可以在回调需要返回一个具体类型的时候被使用:
function foo(cb: () => string) {let res = cb();return res;}foo(() => 'Hello world!');foo(() => fail());foo(() => {throw new Error();});
void
的差异一旦有人告诉你,never
表示一个从来不会优雅的返回的函数时,你可能马上就会想到与类似的 void
,然而实际上,void
表示没有任何类型,never
表示永远不存在的值的类型。
当一个函数没有返回值时,它返回了一个 void
类型,但是,当一个函数根本就没有返回值时(或者总是抛出错误),它返回了一个 never
,void
指可以被赋值的类型(在 strictNullChecking
为 false
时),但是 never
不能赋值给其他任何类型,除了 never
。
参考资料: