第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

TypeScript infer 關(guān)鍵字

本節(jié)要介紹的 infer 關(guān)鍵字有些難理解,我們來(lái)通過(guò)一個(gè)類比來(lái)幫助理解。

語(yǔ)句 let num 中,通過(guò) let 來(lái)聲明了一個(gè)變量,那怎樣聲明一個(gè)不確定的類型變量呢? 答案是使用 infer 關(guān)鍵字,infer R 就是聲明了一個(gè)類型變量 R。

1. 慕課解釋

在條件類型表達(dá)式中,可以在 extends 條件語(yǔ)句中使用 infer 關(guān)鍵字來(lái)聲明一個(gè)待推斷的類型變量。

2. 通過(guò) ReturnType 理解 infer

infer 相對(duì)比較難理解,我們先看下 TypeScript 一個(gè)內(nèi)置工具類型 ReturnType 。

  • ReturnType<T> – 獲取函數(shù)返回值類型。
const add = (x:number, y:number) => x + y
type t = ReturnType<typeof add> // type t = number

代碼解釋:

通過(guò) ReturnType 可以得到函數(shù) add() 的返回值類型為 number 類型。但要注意不要濫用這個(gè)工具類型,應(yīng)盡量多的手動(dòng)標(biāo)注函數(shù)返回值類型。

來(lái)看一下 ReturnType 的實(shí)現(xiàn)源碼:

/**
 * Obtain the return type of a function type
 */
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any

infer 的作用是讓 TypeScript 自己推斷,并將推斷的結(jié)果存儲(chǔ)到一個(gè)類型變量中,infer 只能用于 extends 語(yǔ)句中。

再來(lái)看 ReturnType 的實(shí)現(xiàn):如果 T 滿足約束條件 (...args: any) => any,并且能夠賦值給 (...args: any) => infer R,則返回類型為 R,否則為 any 類型。

繼續(xù)看幾個(gè)例子:

type T0 = ReturnType<() => string>        // string
type T1 = ReturnType<(s: string) => void> // void
type T2 = ReturnType<<T>() => T>          // unknown

代碼解釋:

分別可以得到 type T0 = string type T1 = void type T2 = unknown,只要滿足約束條件 (...args: any) => any,TypeScript 推斷出函數(shù)的返回值,并借助 infer 關(guān)鍵字將其儲(chǔ)存在類型變量 R 中,那么最終得到返回類型 R。

3. 借助 infer 實(shí)現(xiàn)元組轉(zhuǎn)聯(lián)合類型

借助 infer 可以實(shí)現(xiàn)元組轉(zhuǎn)聯(lián)合類型,如:[string, number] -> string | number

type Flatten<T> = T extends Array<infer U> ? U : never

type T0 = [string, number]
type T1 = Flatten<T0> // string | number

代碼解釋:

第 1 行,如果泛型參數(shù) T 滿足約束條件 Array<infer U>,那么就返回這個(gè)類型變量 U。

第 3 行,元組類型在一定條件下,是可以賦值給數(shù)組類型,滿足條件:

type TypeTuple = [string, number] 
type TypeArray = Array<string | number>

type B0 = TypeTuple extends TypeArray ? true : false // true

第 4 行,就可以得到 type T1 = string | number。

4. 小結(jié)

infer 理解起來(lái)比較抽象,一定要親手寫(xiě)一下本節(jié)中的例子。借助條件類型的 infer 關(guān)鍵字來(lái)推斷類型,可以實(shí)現(xiàn)一些比如聯(lián)合類型轉(zhuǎn)交叉類型、聯(lián)合類型轉(zhuǎn)元組的操作,有興趣的可以了解一下。