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