TS 4.7 版本新特性,讓 Infer 更簡單
本文阿寶哥將介紹 TypeScript 4.7 版本引入的一個與 infer 有關的新特性,該特性能夠讓 infer 類型推斷變得更加簡潔。在介紹 infer 有關的新特性之前,我們先來看個例子:
type FirstIfString<T> = T extends [infer S, ...unknown[]]
? S extends string
? S
: never
: never;

在以上代碼中,F(xiàn)irstIfString 工具類型使用了 TypeScript 的條件類型、條件鏈和 infer 類型推斷。在第一個條件類型中,我們判斷類型參數(shù) T 的實際類型是否為非空的元組類型,同時使用 infer 聲明了類型變量 S,用于存儲模式匹配過程中,所捕獲元組類型第一個元素的類型。
而在第二個條件類型中,我們會繼續(xù)判斷類型變量 S 是否為字符串類型的子類型,若條件滿足的話,則會返回類型變量 S 所對應的類型,否則所有條件類型的 false 分支都會返回 never 類型。
介紹完 FirstIfString 工具類型的作用之后,我們來驗證一下它的功能:
// string
type A = FirstIfString<[string, number, number]>;
// "hello"
type B = FirstIfString<["hello", number, number]>;
// "hello" | "world"
type C = FirstIfString<["hello" | "world", boolean]>;
// never
type D = FirstIfString<[boolean, number, string]>;

由以上結果可知,F(xiàn)irstIfString 工具類型是可以正常使用的。那么現(xiàn)在問題來了,該工具類型內(nèi)部使用了兩個條件類型,我們能否使用一個條件類型來實現(xiàn)同樣的功能呢?答案是可以的!TypeScript 4.7 版本允許我們?yōu)?infer type 添加可選的 extends 子句,用于指定類型變量的顯式約束。

























