欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

TypeScript類型編程中的extends和infer示例解析

 更新時間:2023年08月04日 10:54:11   作者:Qing  
這篇文章主要為大家介紹了TypeScript類型編程中的extends和infer示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引文

在剛接觸TypeScript的時候,使用最多的就是type和interface這兩個關(guān)鍵字,用來聲明類型,其實這樣也基本滿足日常需求。但是如果需要設(shè)計一些高級類型的話,那么僅僅用原來所掌握的TypeScript知識是無法滿足需求的。

設(shè)計高級類型的話涉及到類型編程的知識點,而類型編程中有兩個關(guān)鍵字非常重要,分別是extends和infer。

extends用來約束入?yún)⒌念愋鸵约斑M(jìn)行條件判斷,infer用來聲明局部的類型變量。

extends

條件判斷

我們舉個簡單的例子來說明

type isOne<T extends number> = T extends 1 ? true : false

我們單獨看T extends 1 ? true : false這部分,這里和JavaScript中的三元表達(dá)式并無二致,但是有些同學(xué)不清楚其中extends表示的是什么含義。

T extends 1 ? true : false表示的含義其實就是傳入的T類型是否能夠賦值給字面量1這個類型,如果可以的話,就返回true,否則返回false

約束參數(shù)類型

繼續(xù)使用上面的例子,我們單獨看T extends number,這里extends的意思就是限制傳入的T類型必須是number類型,否則報錯。

為什么需要有這個限制?

因為我們是要判斷類型T是否能夠賦值給字面量類型1,但是如果傳入的參數(shù)都不是number類型,那么就沒必要做后續(xù)的條件判斷了。

約束infer推導(dǎo)的局部變量類型

type GetFirst<T extends string[]> = T extends [infer FirstChar, ...infer Rest]
  ? `${FirstChar}`
  : never;
type Res = GetFirst<['1', '2', '3']>;

來看看報錯信息,我們傳入的參數(shù)類型限制為sting類型的數(shù)組,但是infer推導(dǎo)出來的類型實際上是unknown類型,所以導(dǎo)致類型不匹配。

解決辦法有三種:

對FirstChar使用extends先做過濾

type GetFirst<T extends string[]> = T extends [infer FirstChar, ...infer Rest]
? FirstChar extends string
  ? `${FirstChar}`
  : never
: never;

FirstChar和string進(jìn)行交叉運算

type GetFirst<T extends string[]> = T extends [infer FirstChar, ...infer Rest]
? `${FirstChar & string}`
: never;

使用infer extends做類型轉(zhuǎn)換

type GetFirst<T extends string[]> = T extends [
infer FirstChar extends string,
...infer Rest
]
? `${FirstChar}`
: never;

infer extends是在ts 4.7版本支持,低于這個版本無法使用。

類型轉(zhuǎn)換

type StrToNum<T extends string> = T extends `${infer Num extends number}` ? Num : T
type Res = StrToNum<"1">
// ts 4.7時,返回的結(jié)果是type Res = number
// ts 4.8及以上, 返回的結(jié)果是type Res = 1

infer

還是拿例子來進(jìn)行講解,下面的例子是要提取Promise包裹的類型。

type PromiseValue<T extends Promise<unknown>> = T extends Promise<infer Value> ? Value : never
type Res = PromiseValue<Promise<string>> // string

畫個簡單的圖來描述下如何提取變量類型。

 注意:infer聲明的局部變量,只能在條件語句為true的分支里面使用。

如果在false分之里面使用通過infer聲明的局部變量,編譯器會直接報錯表示找不到這個變量。

組合使用

ReturnType

內(nèi)置工具類型RetureType用于獲取函數(shù)的返回值類型。

type MyReturnType<T extends (...args: any) => any> 
    = T extends (...args: any) => infer R 
        ? R 
        : any;
type Res = MyReturnType<() => string> // type Res = string

Parameters

內(nèi)置工具類型Parameters用于獲取函數(shù)的參數(shù)類型。

type MyParameters<T extends (...args: any) => any> 
    = T extends (...args: infer P) => any 
        ? P 
        : never;
type Res = MyParameters<(a: string, b: number) => void>  // type Res = [a: string, b: number]

以上就是TypeScript類型編程中的extends和infer示例解析的詳細(xì)內(nèi)容,更多關(guān)于TypeScript類型編程extends infer的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • TypeScript類型操作之字符串處理功能詳解

    TypeScript類型操作之字符串處理功能詳解

    這篇文章主要為大家介紹了TypeScript類型操作之字符串處理功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • ts?類型體操?Chainable?Options?可鏈?zhǔn)竭x項示例詳解

    ts?類型體操?Chainable?Options?可鏈?zhǔn)竭x項示例詳解

    這篇文章主要為大家介紹了ts?類型體操?Chainable?Options?可鏈?zhǔn)竭x項示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 簡單三行代碼函數(shù)實現(xiàn)幾十行Typescript類型推導(dǎo)

    簡單三行代碼函數(shù)實現(xiàn)幾十行Typescript類型推導(dǎo)

    這篇文章主要為大家介紹了簡單三行代碼函數(shù)實現(xiàn)幾十行Typescript類型推導(dǎo)的方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • typescript快速上手的基礎(chǔ)知識篇

    typescript快速上手的基礎(chǔ)知識篇

    靜態(tài)類型的typescript與傳統(tǒng)動態(tài)弱類型語言javascript不同,在執(zhí)行前會先編譯成javascript,因為它強大的type類型系統(tǒng)加持,能讓我們在編寫代碼時增加更多嚴(yán)謹(jǐn)?shù)南拗?。注意,它并不是一門全新的語言,所以并沒有增加額外的學(xué)習(xí)成本
    2022-12-12
  • 適合面向ChatGPT編程的架構(gòu)示例詳解

    適合面向ChatGPT編程的架構(gòu)示例詳解

    這篇文章主要為大家介紹了適合面向ChatGPT編程的架構(gòu)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • jsf實現(xiàn)微信小程序簡潔登錄頁面(附源碼)

    jsf實現(xiàn)微信小程序簡潔登錄頁面(附源碼)

    這篇文章主要介紹了實現(xiàn)微信小程序簡潔登錄頁面?,對于正在學(xué)習(xí)的小伙伴都有一定的參考價值,需要的小伙伴可以參考一下
    2022-01-01
  • TypeScript開發(fā)HapiJS應(yīng)用詳解

    TypeScript開發(fā)HapiJS應(yīng)用詳解

    這篇文章主要為大家介紹了TypeScript開發(fā)HapiJS應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • TypeScript判斷對稱的二叉樹方案詳解

    TypeScript判斷對稱的二叉樹方案詳解

    這篇文章主要為大家介紹了TypeScript判斷對稱的二叉樹方案實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • typescript快速上手的進(jìn)階類型與技術(shù)

    typescript快速上手的進(jìn)階類型與技術(shù)

    本文講述了typescript開發(fā)的一些高級的類型與技術(shù),算是對于基礎(chǔ)知識點的補充,具體內(nèi)容包括:比如元組、枚舉類、接口、泛型相關(guān)概念等。雖說是進(jìn)階,但是內(nèi)容不算多也并不難理解。
    2022-12-12
  • Typescript是必須要學(xué)習(xí)嗎?如何學(xué)習(xí)TS全棧開發(fā)

    Typescript是必須要學(xué)習(xí)嗎?如何學(xué)習(xí)TS全棧開發(fā)

    Typescript目前在前端,網(wǎng)站,小程序中的位置基本無可替代,同時也可以構(gòu)建完美的CLI應(yīng)用。在移動,桌面,后端方面,性能不是要求很高的情況下完全可以勝任,并且在區(qū)塊鏈,嵌入式,人工智能方面也開始茁壯成長。
    2022-12-12

最新評論