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> 看他們的源碼就知道什麼意思)。

相關文章
相關標籤/搜索