TypeScript 的 never 类型

TS2.0 推出的 never 类型后,让 type 类型的操做,更加灵活。html

与 void 的区别

一般状况下咱们会这样定义无返回值的函数:typescript

fun: () => void; 
复制代码

但在 TS 中 void 至少包含了如下几个子类型:函数

  • undefined
  • null

例以下面的实例:post

// strictNullChecks = false 时
const v: void // 等同于 undefined | null

// strictNullChecks = true 时
const v: void // 等同于 undefined
复制代码

彻底无返回值

而 never 是彻底没有返回值的类型,只有一种状况会如此:代码阻断。ui

那么当执行 throw new Errorreturn 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> 看他们的源码就知道什么意思)。

相关文章
相关标签/搜索