在 TS2.0 推出的 never 类型后,让 type 类型的操做,更加灵活。html
一般状况下咱们会这样定义无返回值的函数:typescript
fun: () => void;
复制代码
但在 TS 中 void
至少包含了如下几个子类型:函数
例以下面的实例:post
// strictNullChecks = false 时
const v: void // 等同于 undefined | null
// strictNullChecks = true 时
const v: void // 等同于 undefined
复制代码
而 never 是彻底没有返回值的类型,只有一种状况会如此:代码阻断。ui
那么当执行 throw new Error
、 return process.exit(1)
、while(true){}
时都知足此条件:spa
function error(message: string): never {
throw new Error(message);
}
复制代码
若是函数的返回值类型是 never
意味的此函数必须不能被顺利完整执行,而发生中断行为。code
never 是全部类型的子类型,所以能够理解为:全部的函数的返回值都包含 never 类型:htm
function fun(s: string): number {
if (s == 'a') return 1;
if (s == 'b') return 2;
throw new Error;
}
// 等同于 fun(s: string): number | never
复制代码
只要不是单独申明为 never 类型,都会被显性的展现起来,所以下面的声明中也会忽略 never:ip
type Temp = 1 | 'a' | never
// 获得
// type Temp = 1 | 'a'
Type ne = never
// 获得
// type ne = never
复制代码
以前咱们讲解 TypeScript 的 extends 条件类型 时,封装 Filter<T, U>
函数类型就用到了 never 类型的返回值的特性:get
type Filter<T, U> = T extends U ? never : T;
type Values = Filter<"x" | "y" | "z", "x">;
// 获得 type Values = "y" | "z"
复制代码
理解这些类型后,以后理解官方预约于的高级类型,将很是轻松(例如:Exclude<T, U>
、Extract<T, U>
、NonNullable<T>
看他们的源码就知道什么意思)。