TS 4.7 版本新特性,讓 Infer 更簡(jiǎn)單
本文阿寶哥將介紹 TypeScript 4.7 版本引入的一個(gè)與 infer 有關(guān)的新特性,該特性能夠讓 infer 類型推斷變得更加簡(jiǎn)潔。在介紹 infer 有關(guān)的新特性之前,我們先來(lái)看個(gè)例子:
type FirstIfString<T> = T extends [infer S, ...unknown[]]
? S extends string
? S
: never
: never;
在以上代碼中,F(xiàn)irstIfString 工具類型使用了 TypeScript 的條件類型、條件鏈和 infer 類型推斷。在第一個(gè)條件類型中,我們判斷類型參數(shù) T 的實(shí)際類型是否為非空的元組類型,同時(shí)使用 infer 聲明了類型變量 S,用于存儲(chǔ)模式匹配過(guò)程中,所捕獲元組類型第一個(gè)元素的類型。
而在第二個(gè)條件類型中,我們會(huì)繼續(xù)判斷類型變量 S 是否為字符串類型的子類型,若條件滿足的話,則會(huì)返回類型變量 S 所對(duì)應(yīng)的類型,否則所有條件類型的 false 分支都會(huì)返回 never 類型。
介紹完 FirstIfString 工具類型的作用之后,我們來(lái)驗(yàn)證一下它的功能:
// 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]>;
由以上結(jié)果可知,F(xiàn)irstIfString 工具類型是可以正常使用的。那么現(xiàn)在問(wèn)題來(lái)了,該工具類型內(nèi)部使用了兩個(gè)條件類型,我們能否使用一個(gè)條件類型來(lái)實(shí)現(xiàn)同樣的功能呢?答案是可以的!TypeScript 4.7 版本允許我們?yōu)?infer type 添加可選的 extends 子句,用于指定類型變量的顯式約束。