国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

TS 類型體操:圖解一個復雜高級類型

開發 前端
之前我們零散地了解了一些 TypeScript 類型體操的套路,但是沒有綜合練習下,今天就來做個高難度的體操,它會綜合運用模式匹配、構造、遞歸等套路,對提升類型編程水平很有幫助。

之前我們零散地了解了一些 TypeScript 類型體操的套路,但是沒有綜合練習下,今天就來做個高難度的體操,它會綜合運用模式匹配、構造、遞歸等套路,對提升類型編程水平很有幫助。

我們要實現的高級類型如下:

它的類型參數是參數字符串 query string,會返回解析出的參數對象,如果有同名的參數,會把值做合并。

先不著急實現,我們先回顧下相關的類型體操基礎:

類型體操基礎

模式匹配

模式匹配是指用一個類型匹配一個模式類型來提取其中的部分類型到 infer 聲明的局部變量中。

比如提取 a=b 中的 a 和 b:

這種模式匹配的套路在數組、字符串、函數等類型中都有很多應用。

詳細了解可以看之前的一篇文章:模式匹配-讓你 ts 類型體操水平暴增的套路

構造

映射類型用于生成索引類型,生成的過程中可以對索引或者索引值做一些修改。

比如指定 key 和 value 來生成一個索引類型:

詳細了解可以看之前的一篇文章:TS 類型體操:索引類型的映射再映射

遞歸

TypeScript 高級類型支持遞歸,可以處理數量不確定的問題。

比如不確定長度的字符串的反轉:

type ReverseStr< 
Str extends string,
Result extends string = ''
> = Str extends `${infer First}${infer Rest}`
? ReverseStr<Rest, `${First}${Result}`>
: Result;

簡單了解下模式匹配、構造、遞歸都是什么之后,就可以開始實現這個復雜的高級類型 ParseQueryString 了:

思路分析

假設有這樣一個 query string:a=1&a=2&b=3&c=4。

我們要首先把它分成 4 部分:也就是 a=1、a=2、b=3、c=4。這個就是用通過上面講的模式匹配來提取。

每一部分又可以進一步處理,提取出 key value 構造成索引類型,比如 a=1 就可以通過模式匹配提取出 a、1,然后構造成索引類型 {a: 1}。

這樣就有了 4 個索引類型 {a:1}、{a:2}、{b:3}、{c:4}。

結下來把它合并成一個就可以了,合并的時候如果有相同的 key 的值,要放到數組里。

就產生了最終的索引類型:{a: [1,2], b: 3, c: 4}

整體流程是這樣的:

其中第一步并不知道有多少個 a=1、b=2 這種 query param,所以要遞歸的做模式匹配來提取。

這就是這個高級類型的實現思路。

下面我們具體來寫一下:

代碼實現

我們按照上圖的順序來實現,首先提取 query string 中的每一個 query param:

query param 數量不確定,所以要用遞歸:

type ParseQueryString<Str extends string>
= Str extends `${infer Param}&${infer Rest}`
? MergeParams<ParseParam<Param>, ParseQueryString<Rest>>
: ParseParam<Str>;

類型參數 Str 為待處理的 query string。

通過模式匹配提取其中第一個 query param 到 infer 聲明的局部變量 Param 中,剩余的字符串放到 Rest 中。

用 ParseParam 來處理 Param,剩余的遞歸處理,最后把它們合并到一起,也就是 MergeParams 。

如果模式匹配不滿足,說明還剩下最后一個 query param 了,也用 ParseParam 處理。

然后分別實現每一個 query param 的 parse:

這個就是用模式匹配提取 key 和 value,然后構造一個索引類型:

type ParseParam<Param extends string> 
= Param extends `${infer Key}=${infer Value}`
? { [K in Key]: Value }
: {};

這里構造索引類型用的就是映射類型的語法。

先來測試下這個 ParseParam:

做完每一個 query param 的解析了,之后把它們合并到一起就行:

合并的部分就是 MergeParams:

type MergeParams<
OneParam extends object,
OtherParam extends object
> = {
[Key in keyof OneParam | keyof OtherParam]:
Key extends keyof OneParam
? Key extends keyof OtherParam
? MergeValues<OneParam[Key], OtherParam[Key]>
: OneParam[Key]
: Key extends keyof OtherParam
? OtherParam[Key]
: never
}

兩個索引類型的合并也是要用映射類型的語法構造一個新的索引類型。

key 是取自兩者也就是 key in keyof OneParam | keyof OtherParam。

value 要分兩種情況:

  • 如果兩個索引類型都有的 key,就要做合并,也就是 MergeValues。
  • 如果只有其中一個索引類型有,那就取它的值,也就是 OtherParam[key] 或者 OneParam[Key]。

合并的時候,如果兩者一樣就返回任意一個,如果不一樣,就合并到數組里返回,也就是 [One, Other]。如果本來是數組的話,那就是數組的合并 [One, ...Other]。

type MergeValues<One, Other> = 
One extends Other
? One
: Other extends unknown[]
? [One, ...Other]
: [One, Other];

測試下 MergeValues:

這樣,我們就實現了整個高級類型,整體測試下:

這個案例綜合運用到了遞歸、模式提取、構造的套路,還是比較復雜的。

可以對照著這張圖來看下完整代碼:

type ParseParam<Param extends string> = 
Param extends `${infer Key}=${infer Value}`
? {
[K in Key]: Value
} : {};

type MergeValues<One, Other> =
One extends Other
? One
: Other extends unknown[]
? [One, ...Other]
: [One, Other];

type MergeParams<
OneParam extends object,
OtherParam extends object
> = {
[Key in keyof OneParam | keyof OtherParam]:
Key extends keyof OneParam
? Key extends keyof OtherParam
? MergeValues<OneParam[Key], OtherParam[Key]>
: OneParam[Key]
: Key extends keyof OtherParam
? OtherParam[Key]
: never
}

type ParseQueryString<Str extends string> =
Str extends `${infer Param}&${infer Rest}`
? MergeParams<ParseParam<Param>, ParseQueryString<Rest>>
: ParseParam<Str>;


type ParseQueryStringResult = ParseQueryString<'a=1&a=2&b=2&c=3'>;

總結

我們首先復習了下 3 種類型體操的套路:

模式匹配:一個類型匹配一個模式類型,提取其中的部分類型到 infer 聲明的局部變量中

構造:通過映射類型的語法來構造新的索引類型,構造過程中可以對索引和值做一些修改

遞歸:當處理數量不確定的類型時,可以每次只處理一個,剩下的遞歸來做

然后用這些套路來實現了一個 ParseQueryString 的復雜高級類型。

如果能獨立實現這個高級類型,說明你對這三種類型體操的套路掌握的就挺不錯的了。


責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2022-01-19 23:41:56

TS索引類型

2022-09-20 14:43:55

TypeScript類型體操

2021-12-10 08:21:15

TypeScript高級類型類型體操

2025-04-10 05:00:00

JavaScriptReactWeb

2024-02-19 10:24:32

Chainable工具類型類型體操

2024-03-04 06:40:49

工具類型TypeScripDeepPick

2021-12-25 22:29:31

類型編程Javascript類型體操

2021-05-30 07:59:00

String引用類型

2024-11-14 08:31:02

2022-08-14 06:59:01

TS 類型編程索引類型

2024-12-30 09:03:09

2022-12-30 08:08:30

2022-05-07 07:33:55

TypeScript條件類型

2021-07-24 13:11:19

Redis數據技術

2022-02-25 14:04:56

TS前端代碼

2022-04-29 06:54:48

TS 映射類型User 類型

2022-08-08 23:49:01

TypeScriptumd模塊

2022-04-17 10:29:10

TSTypeScript對象類型

2009-06-18 15:53:37

Hibernate B

2022-08-14 09:01:27

代碼字符串
點贊
收藏

51CTO技術棧公眾號

51亚洲精品| 午夜精品一区二区三区国产 | 日韩在线观看免费全集电视剧网站| 黄在线观看网站| 国产欧美亚洲一区| 欧美一区二区三区四区在线| 波多野结衣精品| 黄色成人av在线| www.国产区| 精品一区二区三区在线观看国产| 91精品视频大全| 亚洲天堂中文字幕在线观看| 亚洲成**性毛茸茸| wwwxxx在线观看| 午夜精品在线看| 天堂一区在线观看| av午夜精品一区二区三区| 亚洲高清123| 一本色道久久| 成人免费自拍视频| 久久av超碰| 2019中文字幕在线观看| 99综合久久| 中日韩美女免费视频网址在线观看| 高清电影在线观看免费| 制服丝袜日韩国产| 91caoporn在线| 欧美性精品220| y4480在线8影院| 国产精品福利电影一区二区三区四区| 欧美日韩视频免费| 久久99精品国产91久久来源| 女女同性女同一区二区三区91| 欧美日韩天堂| 国产成人精品福利一区二区三区| 久久网站免费观看| 国产精品久久久久久久av大片| 欧美福利在线播放网址导航| 久久久久久免费精品| 久久国产精品免费一区二区三区| 最近日韩中文字幕中文| 国产成人精品一区二区三区视频| 一区二区三区黄色| 日日狠狠久久| 欧美精品电影在线| 精品自拍偷拍| 国产精品69久久| 日韩黄色大片网站| 国产精品主播视频| 夜间精品视频| 国产欧美一区二区三区不卡高清| 午夜精品偷拍| 精品久久久久久乱码天堂| 国产亚洲一级| 午夜啪啪福利视频| 99免费精品在线| 亚洲欧美自拍另类日韩| 亚洲电影在线免费观看| 精品无吗乱吗av国产爱色| 3d动漫精品啪啪一区二区竹菊| 视频在线观看入口黄最新永久免费国产| 日韩欧美激情四射| 国产精品99| 久久久久中文字幕2018| 久久激情电影| 日本一区二区高清视频| 国产精品一区二区三区网站| 欧美 日韩 国产 高清| 国产精品黄色在线观看| 欧美在线观看在线观看| 日韩禁在线播放| 岛国成人av| 2014亚洲精品| 精品亚洲porn| 欧美日韩在线中文| 依依成人综合视频| 欧美日本高清| 亚洲欧美国产一本综合首页| 一区二区三区亚洲变态调教大结局 | 久久久久久久网| 樱桃视频免费看| 777奇米成人网| 精品69视频一区二区三区| 2018日韩中文字幕| 亚洲精品系列| 国产精品宾馆在线精品酒店| 精品magnet| 麻豆视频在线看| 青青精品视频播放| 久久亚洲图片| www.精品在线| 91精品国产一区二区| 96视频在线观看欧美| 91久久嫩草影院一区二区| 韩国成人精品a∨在线观看| 成人18网址在线观看| 欧美日韩一区二区在线视频| 四虎影视国产精品| 国产精品免费一区二区三区在线观看| 国产91丝袜在线观看| 天堂影院在线| 久久精品亚洲热| 国产视频一区免费看| 丝袜制服影音先锋| 日韩精品在线私人| 欧美黄色精品| 免费女人黄页| 亚洲一区999| 亚洲精品护士| 免费在线黄网| yw.139尤物在线精品视频| 一本色道久久综合亚洲精品不卡| www.日本一区| 国产一区二区三区在线观看网站 | 95av在线视频| 91亚洲男人天堂| 国产福利视频在线观看| 欧美孕妇与黑人孕交| 国产一二精品视频| 欧美男男同志| 2019中文字幕在线免费观看| 国产乱码一区二区三区| 国产黄色片在线观看| 欧美亚洲在线视频| 99麻豆久久久国产精品免费优播| 成人区精品一区二区不卡| 国产精品第一页在线| 99re热这里只有精品视频| 免费不卡av| 国产一区国产精品| 亚洲午夜精品17c| 精品一区二区三区中文字幕在线| 亚洲欧洲精品一区| 3d动漫精品啪啪一区二区竹菊| 精品九九在线| 成人免费网站视频www| 伊人久久免费视频| 韩国成人在线视频| www.8ⅹ8ⅹ羞羞漫画在线看| 国产精品免费一区二区三区在线观看| 亚洲国产精品自拍| 九九热线有精品视频99| 中文字幕视频在线免费观看| xxxxxxxxx欧美| 成人h版在线观看| 伊人久久视频| 在线免费观看成人网| 91精品视频网| 日韩一级大片| 天天影视久久综合| 国产精品一 二 三| 欧美性视频一区二区三区| 91精品国产自产拍在线观看蜜| 天天干狠狠干| 国产精自产拍久久久久久| 亚洲在线成人精品| 成人在线免费视频观看| 国外男同性恋在线看| 国产美女被下药99| 欧美日韩国产一区中文午夜| 99久久影视| 国产视频二区在线观看| 国产在线精品一区| 91精品中文字幕一区二区三区| 99精品视频免费观看| 黄色网址视频在线观看| 亚洲自拍偷拍二区| 亚洲午夜小视频| av网站免费线看精品| 日韩中文字幕视频网| 四虎精品一区二区永久在线观看| 国语自产精品视频在线看| 亚洲免费观看高清完整版在线观看熊| 中国av一区| 日本国产在线| 欧美18视频| 日韩精品福利在线| 久久久久久夜精品精品免费| 女同另类激情重口| 四虎精品成人免费网站| 欧美高清一区二区| 中文字幕精品一区久久久久 | 美乳视频一区二区| 亚洲第一精品福利| 丁香啪啪综合成人亚洲小说| 久久精品九色| 一级毛片免费观看| 国产精品伊人日日| 亚洲福利视频在线| 久久久精品综合| 欧美电影一二区| www.在线视频| 国产日韩av网站| 日本三级韩国三级久久| 欧美午夜一区二区| 国产剧情在线观看一区二区| 日韩免费电影在线观看| 成人影院免费观看| 精品这里只有精品| 96久久精品|