最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引文

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

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

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

extends

條件判斷

我們舉個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明

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

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

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

約束參數(shù)類型

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

為什么需要有這個(gè)限制?

因?yàn)槲覀兪且袛囝愋蚑是否能夠賦值給字面量類型1,但是如果傳入的參數(shù)都不是number類型,那么就沒(méi)必要做后續(xù)的條件判斷了。

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

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

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

解決辦法有三種:

對(duì)FirstChar使用extends先做過(guò)濾

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

FirstChar和string進(jìn)行交叉運(yù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版本支持,低于這個(gè)版本無(wú)法使用。

類型轉(zhuǎn)換

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

infer

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

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

畫個(gè)簡(jiǎn)單的圖來(lái)描述下如何提取變量類型。

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

如果在false分之里面使用通過(guò)infer聲明的局部變量,編譯器會(huì)直接報(bào)錯(cuò)表示找不到這個(gè)變量。

組合使用

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的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • typescript在vue中的入門案例代碼demo

    typescript在vue中的入門案例代碼demo

    這篇文章主要介紹了typescript在vue中的入門案例代碼demo,使用技術(shù)棧vue2+typescript+scss入門練手項(xiàng)目,天氣預(yù)報(bào)demo,需要的朋友可以參考下。
    2022-12-12
  • TypeScript數(shù)據(jù)結(jié)構(gòu)棧結(jié)構(gòu)Stack教程示例

    TypeScript數(shù)據(jù)結(jié)構(gòu)棧結(jié)構(gòu)Stack教程示例

    這篇文章主要為大家介紹了TypeScript數(shù)據(jù)結(jié)構(gòu)棧結(jié)構(gòu)Stack教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Manipulation-TypeScript?DOM操作示例解析

    Manipulation-TypeScript?DOM操作示例解析

    這篇文章主要為大家介紹了DOM?Manipulation-TypeScript?DOM操作示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • layui.layer彈出層(子頁(yè)面)改變父頁(yè)面內(nèi)容(訪問(wèn)元素和函數(shù))

    layui.layer彈出層(子頁(yè)面)改變父頁(yè)面內(nèi)容(訪問(wèn)元素和函數(shù))

    當(dāng)前頁(yè)面(父框架或父頁(yè)面)使用layer以iframe層的方式彈出新的窗口(子框架或子頁(yè)面)時(shí),如何在子頁(yè)面中訪問(wèn)父頁(yè)面的元素和函數(shù),從而改變父元素的頁(yè)面顯示,給用戶合理舒適的體驗(yàn)。
    2023-02-02
  • TypeScript與JavaScript的區(qū)別分析

    TypeScript與JavaScript的區(qū)別分析

    TypeScript可以使用JavaScript中的所有代碼和編程概念,TypeScript是為了使JavaScript的開發(fā)變得更加容易而創(chuàng)建的。推薦先精通JS的的前提下再學(xué)習(xí)TS,這樣更有利于同時(shí)學(xué)習(xí)兩門語(yǔ)言。
    2022-12-12
  • 開發(fā)typescript項(xiàng)目tsconfig.json配置及選項(xiàng)使用解析

    開發(fā)typescript項(xiàng)目tsconfig.json配置及選項(xiàng)使用解析

    這篇文章主要為大家介紹了tsconfig.json配置及選項(xiàng)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 微信小程序?qū)崿F(xiàn)圖片預(yù)加載組件

    微信小程序?qū)崿F(xiàn)圖片預(yù)加載組件

    預(yù)加載圖片是提高用戶體驗(yàn)的一個(gè)很好方法。圖片預(yù)先加載到瀏覽器中,訪問(wèn)者便可順利地在你的網(wǎng)站上沖浪,并享受到極快的加載速度。下面這篇文章主要介紹了微信小程序?qū)崿F(xiàn)圖片預(yù)加載組件的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • typescript快速上手的進(jìn)階類型與技術(shù)

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

    本文講述了typescript開發(fā)的一些高級(jí)的類型與技術(shù),算是對(duì)于基礎(chǔ)知識(shí)點(diǎn)的補(bǔ)充,具體內(nèi)容包括:比如元組、枚舉類、接口、泛型相關(guān)概念等。雖說(shuō)是進(jìn)階,但是內(nèi)容不算多也并不難理解。
    2022-12-12
  • TypeScript中的函數(shù)重載示例分析

    TypeScript中的函數(shù)重載示例分析

    這篇文章主要為大家介紹了TypeScript中的函數(shù)重載示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • TypeScript保姆級(jí)基礎(chǔ)教程

    TypeScript保姆級(jí)基礎(chǔ)教程

    這篇文章主要為大家介紹了TypeScript保姆級(jí)基礎(chǔ)教程示例詳解,主要為大家介紹了typescript的類型,函數(shù),對(duì)象,接口等基礎(chǔ)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-07-07

最新評(píng)論

合川市| 常宁市| 木兰县| 贵州省| 丰顺县| 祁阳县| 赣州市| 丰都县| 达拉特旗| 新竹市| 波密县| 泾源县| 柯坪县| 赞皇县| 南涧| 缙云县| 西丰县| 通海县| 通许县| 年辖:市辖区| 河津市| 元阳县| 东源县| 龙门县| 民和| 泽州县| 徐闻县| 丹棱县| 万年县| 富平县| 高平市| 寿宁县| 江城| 库尔勒市| 东丽区| 石楼县| 府谷县| 怀宁县| 九江县| 温泉县| 游戏|