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

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

 更新時間:2022年09月16日 14:06:27   作者:盞燈  
這篇文章主要為大家介紹了ts?類型體操?Chainable?Options?可鏈?zhǔn)竭x項示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

問題

在JavaScript我們通常會使用到可串聯(lián)(Chainable/Pipline)的函數(shù)構(gòu)造一個對象,但是在Typescript中,你能合理地給它賦上類型嗎?

題目是: 可以使用任何你喜歡的方式實現(xiàn)這個類型 - interface, type, 或者 class 都行。你需要提供兩個函數(shù)option(key, value)get()

option 中你需要使用提供的key和value來擴展當(dāng)前的對象類型,通過 get()獲取最終結(jié)果。

注意: 你只需要在類型層面實現(xiàn)這個功能 - 不需要實現(xiàn)任何 ts/js 的實際邏輯。 你可以假設(shè)key只接受字符串而value接受任何類型,你只需要暴露它傳遞的類型而不需要進行任何處理。同樣的key只會被使用一次。

例子是:

declare const config: Chainable
const result = config
    .option('foo', 123)
    .option('bar', { value: 'Hello World' })
    .option('name', 'type-challenges')
    .get()
// expect the type of the result to be:
interface Result {
    foo: number
    name: string
    bar: {
        value: string
    }
}

答案

type Chainable = {
  option(key: string, value: any): any
  get(): any
}

把這個any改成答案即可。作者要求我們做什么?需要實現(xiàn)兩個方法,一個是options(key, value),另一個是get()

option(key, value): 必須在某處累加 keyvalue 的類型信息。累加操作必須持續(xù)進行,直到調(diào)用get函數(shù)將累加的信息作為一個對象類型返回。

先看看提供的樣例:

const result1 = a
    .option('foo', 123)
    .option('bar', {value: 'Hello World'})
    .option('name', 'type-challenges')
    .get()
希望得到的是:
type Expectd1 = {
    foo: number,
    bar: {
        value: string
    },
    name: string
}

傳參

把option傳的key值和value值給對應(yīng)改了。所以我們把keyvalueany替換成類型參數(shù),以便ts可以推斷出它們的類型并將其分配給類型參數(shù):

type Chainable<T = {}> = {
  option<K, V>(key: K, value: V): any
  get(): any
}

我們現(xiàn)在有了關(guān)于keyvalue的類型信息。ts會將key推斷為字符串字面量類型, 而將value推斷為常見的類型。

例如: 調(diào)用option('foo', 123)將得出的類型為: key = 'foo‘ 和 value = number

我們有了信息后,把它存儲在哪里呢?它必須是一個在若干次方法調(diào)用中保持其狀態(tài)的地方。唯一的地方便是Chainable類型本身。

讓我們?yōu)?code>Chainable類型添加一個新的類型參數(shù)T,并且不能忘記默認它是一個空對象。

type Chainable<T = {}> = {}

option部分

注意,我們希望option(key, value)返回Chainable類型本身(我們希望有可能進行鏈?zhǔn)秸{(diào)用),但是要將類型信息累加到其類型參數(shù)中。

那么我們使用&來將新的類型添加到累加器中:

type Chainable&lt;T = {}&gt; = {
    option&lt;K, V&gt;(key: K, value: V): Chainable&lt;T &amp; { [k in K] : V }&gt;;
    get(): any
}

這里值得提一下為什么是 { [k in K] : V }, 直接寫 { K : V } 不行嗎?為什么還要in一下?

由于K是類型,類型是不能直接當(dāng)成key的,在ts中對象如若想要以類型來當(dāng)key也就是類型當(dāng)鍵,要[k in K]這樣寫才行。

比如說: 定義一個類型key value這種字面量的對象,當(dāng)時必須value是string類型。

type a<K extends string> = {[k in K]: string}
type b = a<>
const c:b = {
  a: 'c'
}

那接上面,所以這個K必須是string類型,js中字面量的key必須是string類型。所以改一下:

type Chainable<T = {}> = {
    option<K extends string, V>(key: K, value: V): Chainable<T & { [k in K] : V }>;
    get(): any
}

get

那么,這個get()函數(shù)調(diào)用的時候,應(yīng)該返回什么呢,它必須從Chainable返回類型參數(shù)T,也就是option(key, value)鏈?zhǔn)秸{(diào)用所得到的的這么一個對象,也就是option(key, value)一直點調(diào)用的整體類型信息,那么就是傳入的這個參數(shù)也就是T本身。

type Chainable<T = {}> = {
    option<K extends string, V>(key: K, value: V): Chainable<T & { [k in K] : V }>;
    get(): T
}

那么這樣就完成了嗎?我們來看一下測試結(jié)果

怎么還有紅色波浪線,我們來看看

const result2 = a
  .option('name', 'another name')
  // @ts-expect-error
  .option('name', 'last name')
  .get()

哦,原來是這個對象中key相同的了,就不用再點調(diào)用下去了,直接省略。那么也就是說這個key的類型要控制一下,當(dāng)判斷到這個key已經(jīng)存在了,我們就略過

type Chainable<T = {}> = {
    option<K extends string, V>(key: K extends keyof T ? never : K, value: V): Chainable<T & { [k in K] : V }>;
    get(): T
}

單拎出來看看

key: K extends keyof T ? never : K

至此,完成這一道題!

以上就是ts 類型體操 Chainable Options 可鏈?zhǔn)竭x項示例詳解的詳細內(nèi)容,更多關(guān)于ts 類型Chainable Options的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • ThreeJS使用紋理貼圖創(chuàng)建一個我的世界草地方塊

    ThreeJS使用紋理貼圖創(chuàng)建一個我的世界草地方塊

    這篇文章主要為大家介紹了ThreeJS使用紋理貼圖創(chuàng)建一個我的世界草地方塊的實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • TypeScript保姆級基礎(chǔ)教程

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

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

    Webpack source map實戰(zhàn)分析詳解

    這篇文章主要為大家介紹了Webpack source map示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • typescript快速上手的進階類型與技術(shù)

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

    本文講述了typescript開發(fā)的一些高級的類型與技術(shù),算是對于基礎(chǔ)知識點的補充,具體內(nèi)容包括:比如元組、枚舉類、接口、泛型相關(guān)概念等。雖說是進階,但是內(nèi)容不算多也并不難理解。
    2022-12-12
  • TypeScript Nim交替使用細節(jié)分析

    TypeScript Nim交替使用細節(jié)分析

    這篇文章主要為大家介紹了TypeScript Nim交替使用細節(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • TypeScript與JavaScript的區(qū)別分析

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

    TypeScript可以使用JavaScript中的所有代碼和編程概念,TypeScript是為了使JavaScript的開發(fā)變得更加容易而創(chuàng)建的。推薦先精通JS的的前提下再學(xué)習(xí)TS,這樣更有利于同時學(xué)習(xí)兩門語言。
    2022-12-12
  • 高級前端面試手寫扁平數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)Tree

    高級前端面試手寫扁平數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)Tree

    這篇文章主要為大家介紹了高級前端面試手寫扁平數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)Tree示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Typescript?extends?關(guān)鍵字繼承類型約束及條件類型判斷實現(xiàn)示例解析

    Typescript?extends?關(guān)鍵字繼承類型約束及條件類型判斷實現(xiàn)示例解析

    這篇文章主要介紹了Typescript?extends?關(guān)鍵字繼承類型約束及條件類型判斷實現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • TypeScript中的數(shù)據(jù)類型enum?type?interface基礎(chǔ)用法示例

    TypeScript中的數(shù)據(jù)類型enum?type?interface基礎(chǔ)用法示例

    這篇文章主要為大家介紹了TypeScript中的數(shù)據(jù)類型enum?type?interface基礎(chǔ)用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • TypeScript實現(xiàn)類型安全的EventEmitter

    TypeScript實現(xiàn)類型安全的EventEmitter

    這篇文章主要為大家介紹了TypeScript實現(xiàn)類型安全的EventEmitter示例詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

鄯善县| 新密市| 阜宁县| 蓝山县| 德江县| 达日县| 洪雅县| 荥阳市| 东辽县| 玉屏| 临江市| 奇台县| 靖西县| 南阳市| 吕梁市| 安宁市| 泰宁县| 千阳县| 万年县| 万载县| 温宿县| 晋江市| 分宜县| 贵德县| 桃源县| 宿州市| 甘孜县| 逊克县| 荆门市| 吉林市| 安乡县| 三江| 台江县| 迁安市| 桂阳县| 都兰县| 包头市| 日照市| 灵寿县| 诸暨市| 那坡县|