精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從 React 源碼的類型定義中,我學到了什么?

開發 前端
React 類型定義做的挺完善的,考慮到了各種類型的處理,也考慮到了低版本的兼容,從中還是能學到不少東西的。

今天看了下 React 的類型定義,也就是 @types/react 包下的 index.d.ts,發現了一些有趣的寫法。

這篇文章就分享下這些寫法,估計大部分人都不知道:

提取可選索引的值

首先,我看到了這樣一段類型邏輯:

這段邏輯就是取索引類型的 ref 索引的值,但是是通過模式匹配的方式,把提取的類型放到 infer 聲明的局部變量 R 里返回的。

簡化一下就是這樣的:

提取 Props 的 ref 索引的值的類型返回。

我在想,這么麻煩干什么,直接 Props['ref'] 不就能拿到 ref 索引的值么?

于是我就改成了這樣:

然后試了下:

不對呀,人家這是可選索引,值的類型是包含 undefined 的聯合類型。

那就 Exclude 下不就行了:

這樣也比那個 infer 的方式簡潔呀,為啥 React 類型定義都是用的 infer 取的可選索引的類型呢?

后來我突然想到,如果這個 ref 值的類型就是 undefined 呢?

我試了下:

確實,我那樣寫是有問題的,如果值的類型本來就是 undefined,Exclude 掉 undefined 后就是 never 了,而人家那種方式就沒問題:

于是我就加一下 undefined 的處理:

這樣就行了。

對比了下兩種寫法:

確實還是 React 的那種寫法更簡潔。

對了,那上面那層判斷呢?

這個判斷沒必要的吧,如果沒有 ref,那 Props['ref'] 不就是返回 never 么,沒必要單獨判斷呀?

然后我就看到了這樣一段注釋:

在 ts 3.0 中,如果索引類型沒有對應的索引,那返回的類型是 {} 而不是 never。

原來如此,這個 'ref' extends keyof Props 是為了做兼容的呀,不是沒意義。

這就是我從這個類型中學到的兩個知識點:

  • 索引訪問 Obj[Key] 和 infer 提取和都可以取到索引類型的某個索引的值,但是當處理可選索引的時候,用 infer 更簡潔一些,因為前者要取出類型之后再單獨處理下 undefined,而后者在 infer 的時候就順便處理了 undefined。
  • ts 3.0 中如果索引類型沒有對應的索引,返回的是 {} 不是 never,如果對兼容性要求高的話,可以用 'xx' in keyOf Obj 的方式做下兼容。

我們從這個類型里學到了不少東西,再來看下第二個類型:

索引類型和 any、never 的處理

然后我又看到了這樣一個類型,

先試一下它的功能,傳入兩個索引類型:

看下結果:

這是些啥啊,誰能看得懂呀。

其實這只是因為 TS 沒有計算出最終的類型而已,用到的時候才會計算,所以我們可以這樣處理下:

Copy 的高級類型是通過映射類型的語法構造了一個新的索引類型,它的功能是原封不動的復制一個索引類型。

類型參數 Obj 約束為索引類型,也就是 Record。key 保持不變,也就是 Key in keyof Obj,value 也保持不變,也就是 Obj[Key]。

因為重新生成的類型的過程中要做計算,所以那個類型就能提示出最終的結果了:

所以說,這個類型的作用是兩個索引類型 A,B,只有 A 中有的就保留,A、B 都有的變為可選,B 有但 A 沒有的變為可選。

那這段邏輯具體是怎么用 TS 實現的呢?

我們先來過一下 TS 這些內置的高級類型:

Pick

Pick 的作用是通過映射類型的語法構造一個新的索引類型,根據傳入的 Key 對索引做下過濾:

type Pick<T, K extends keyof T> = { [P in K]: T[P]; };

測試下:

Partial

Partial 也是通過映射類型的語法構造一個新的索引類型,但是會把索引變為可選:

type Partial<T> = { [P in keyof T]?: T[P]; };

測試下:

Extract

Extract 是取兩個聯合類型都包含的部分,也就是取交集:

type Extract = T extends U ? T : never;

測試下:

Exclude

Exclude 是從聯合類型 A 中去掉聯合類型 B 中的類型,也就是取差集:

type Extract = T extends U ? T : never;

測試下:

學會了用 Pick、Partial、Exclude、Extract 這些高級類型,那上面的那段邏輯我們就知道怎么實現了:

只有 A 中有的就保留的邏輯是:Pick>。

A、B 都有的變為可選:Partial>>。

B 中有但 A 中沒有的也變為可選:Partial>>。

這樣,這個類型的主要邏輯我們就理清了:

把三部分計算結果的索引類型取交叉類型,就會合并到一起。

那前面那兩個判斷是啥?

P extends any 還有這個 string extends keyof P,這倆都是做啥的?

P extends any 這個是因為聯合類型當作為類型參數出現在條件類型左邊時,會把每個類型單獨傳入做計算,最后把計算結果合并成聯合類型,這個特性叫做分布式條件類型。

比如這樣一個聯合類型:

type Union = 'a' | 'b' | 'c';

我們想把其中的 a 大寫,就可以這樣寫:

type UppercaseA<Item extends string> = 
Item extends 'a' ? Uppercase<Item> : Item;

因為 Item 是類型參數,出現在了條件類型的左邊,而且傳入的是聯合類型,那就觸發分發特性,會把每個類型單獨傳入做計算,然后把結果合并成聯合類型。

所以這里的 P extends any 的作用就是觸發聯合類型特性的,從而讓這個類型能正確處理聯合類型。不然聯合類型整個傳入的話,后面怎么做計算。

這里的 P extends any 換成 P extends P 也可以,都是一樣的作用。

那后面那段代碼 string extends keyof P 是啥意思?

這個我確實想了一段時間,如果 { a: 1, b: 2} 這樣的索引類型,keyof 的結果是 'a' | 'b',而如果是數組類型,那 keyof 的結果是 0 | 1 | 'length' | 'toString' | ...

什么類型的 keyof 結果是 string 呢?

突然,我想起了前幾天學到的一個知識點:用 keyof any 代替 string | number | symbol 更靈活:

而且我試了下 never 的 keyof 結果也是這個:

所以說 string extends keyof P 就可以排除 any 和 never 的情況!

妙呀,還能這么區分 any 和 never。

所以說,這個類型的邏輯我們已經理清了:

這個類型的功能是保留只有 A 有的索引,把 A、B 都有的索引變為可選,把只有 B 有的索引變為可選。

而且處理了聯合類型的情況。

如果傳入的是 any 或者 never,不做處理,直接返回。

這個類型里我們也學到了不少東西。

總結

我看了下 @types/react 的類型定義,學到了不少東西:

  • 可選索引的值的提取,用 infer 比 Obj[key] 更方便,因為前者只需要 Obj[Key] extends { xxx?: infer Value: undefined},而后者需要先排除值的類型就是 undefined 的情況,然后再用 Exclude 去掉類型中的 undefined。
  • ts 3.0 中取索引類型沒有的索引會返回 {} 而不是 never,需要兼容的話可以單獨做下判斷:'xxx' in keyof Obj。
  • 處理索引類型可以綜合用 Pick、Partial、Exclude、Extract 等內置高級類型對每一部分索引做處理,然后取交叉類型來合并到一起。
  • P extends any 和 P extends P 的作用是觸發聯合類型的分發特性的,加上這段處理才能正確處理聯合類型,會把每個類型單獨傳入做計算,最后把結果合并成聯合類型。
  • string extends keyof Obj 可以判斷出 any 和 never 類型,只有這兩種類型取 keyof 的結果是 string | nubmer | symbole,包含 string。

而且,還講了一個小技巧:

ts 類型只有計算的時候才會求值,如果是索引類型,可以用映射類型的語法創建個一摸一樣的索引類型,因為用到了,就會做計算,從而就可以顯示出最終的類型。

不得不說,React 類型定義做的挺完善的,考慮到了各種類型的處理,也考慮到了低版本的兼容,從中還是能學到不少東西的。

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2021-03-09 09:55:02

Vuejs前端代碼

2021-04-15 08:15:27

Vue.js源碼方法

2020-10-30 12:40:04

Reac性能優化

2020-12-31 10:47:03

開發Vuejs技術

2016-01-18 10:06:05

編程

2020-02-22 15:01:51

后端前端開發

2021-01-02 09:48:13

函數運算js

2021-03-13 11:23:51

源碼邏輯框架

2024-04-12 08:54:13

從庫數據庫應用

2020-09-25 06:32:25

前端

2021-10-25 05:43:40

前端技術編程

2021-07-28 07:01:09

薅羊毛架構Vue+SSR

2020-11-04 07:13:57

數據工程代碼編程

2020-02-22 14:49:30

畢業入職半年感受

2023-10-16 08:55:43

Redisson分布式

2023-11-29 07:29:28

ReactSolid

2011-10-18 11:43:25

UNIXC語言丹尼斯·里奇

2019-11-20 09:00:52

Linux 開發操作系統

2023-04-10 07:40:36

GraphQLRest通信模式

2020-07-06 15:24:50

技術人工智能面試
點贊
收藏

51CTO技術棧公眾號

亚洲欧美激情小说另类| 精品国产一级毛片| 亚洲在线视频网站| 激情五月综合色婷婷一区二区 | 国产一区二区三区四区视频 | 免费在线黄网站| 午夜国产在线视频| 久久精品久久精品| 午夜精品99久久免费| 免费污网站在线观看| crdy在线观看欧美| 欧美性猛交99久久久久99按摩| 亚洲精品二区| 高清一区二区三区四区| 日韩精品成人一区二区三区| 欧美成人剧情片在线观看| asian性开放少妇pics| 欧美高清你懂的| 五月婷婷综合网| 一卡二卡3卡四卡高清精品视频| 黄色av免费观看| 另类综合日韩欧美亚洲| 久久久综合av| 日本福利片在线观看| 在线日本制服中文欧美| 精品国一区二区三区| 蜜臀一区二区三区精品免费视频| 黄色激情在线播放| 亚洲男人的天堂av| 日韩精品久久久| 黄色av网址在线| 国产一区久久久| 国产精品福利网| 亚洲天堂一区在线| 国产字幕视频一区二区| www.亚洲人.com| 自拍偷拍视频亚洲| 欧洲亚洲视频| 日韩免费视频一区| 成人黄色一级大片| 成人在线不卡| 欧美性xxxx极品高清hd直播| 国产色一区二区三区| 国产网友自拍视频导航网站在线观看 | 欧美激情视频播放| 国产女人18水真多毛片18精品| 国产一区二区精品久| 精品视频在线播放| 中文字幕影片免费在线观看| 99精品国产高清一区二区麻豆| 欧美精品v国产精品v日韩精品| 午夜激情av在线| 成人做爰视频www网站小优视频| 日韩欧美999| 99爱视频在线| 625成人欧美午夜电影| 五月天网站亚洲| 日本福利视频一区| 波多野结衣在线高清| 亚洲一区二区三区四区五区黄| 伊人久久在线观看| 蜜臀av在线| 亚洲一区二区精品视频| 国产精品一色哟哟| aaa在线播放视频| 天天综合天天综合色| 亚洲熟妇av日韩熟妇在线| av成人影院在线| 天天免费综合色| 日韩欧美精品在线观看视频| 欧洲一区二区三区精品| 精品视频一区 二区 三区| 日本中文字幕高清| 99tv成人影院| 日韩美女在线视频| www.免费av| 国产成人短视频在线观看| 在线不卡国产精品| 亚洲人做受高潮| 一区二区在线| 国产69精品久久久| 中文字幕在线看人| 蜜臀av性久久久久蜜臀aⅴ流畅 | 僵尸世界大战2 在线播放| 超碰成人av| 色激情天天射综合网| jizzzz日本| 精品久久免费| 亚洲精品国产品国语在线| 97人妻精品一区二区免费| 91一区二区| 欧美极品少妇xxxxx| 欧美a视频在线观看| 久国产精品韩国三级视频| 91手机在线视频| 亚洲欧美综合一区二区| 国产精品美女久久福利网站| 日韩一级特黄毛片| 日韩三级影视| 日韩小视频在线观看专区| 亚洲av永久无码精品| 欧美精美视频| 欧美大片免费观看在线观看网站推荐| www.日本精品| 韩国三级中文字幕hd久久精品| 国产一区二区久久久| 91porn在线观看| 亚洲18女电影在线观看| 91人人澡人人爽人人精品| 9l亚洲国产成人精品一区二三| 一区二区三区www| 久久精品国产亚洲av无码娇色| 青青国产91久久久久久| 精品91免费| 污片视频在线免费观看| 欧美日韩免费不卡视频一区二区三区| 国产精品久久久久久亚洲av| 福利片在线看| 亚洲三级在线免费观看| 日本三级免费观看| 51亚洲精品| 中文字幕综合一区| 亚洲国产成人无码av在线| 国产成人免费视| 一本久道久久综合| 日韩毛片免费观看| 亚洲精品久久久久久久久久久久| 久久99久久99精品免费看小说| 午夜一级久久| 国产伦精品一区二区三区| 蜜桃成人免费视频| 91欧美在线视频| 欧美日韩精品在线视频| 久草福利在线观看| 四季av一区二区凹凸精品| 国产精品久久福利| 亚洲精品高清视频| 韩国精品主播一区二区在线观看| 亚洲国产小视频| 国产一级片免费看| 成人一道本在线| 99热这里只有精品免费| 国产精品一区免费在线 | 亚洲第九十七页| 黑人一区二区三区四区五区| av成人在线电影| 欧美高清视频| 欧美日韩国产综合一区二区三区| 国产亚洲精品熟女国产成人| 天堂久久久久va久久久久| 蜜桃91精品入口| jizz内谢中国亚洲jizz| 亚洲欧美视频在线| 婷婷激情五月综合| 国产免费观看久久| 色片在线免费观看| 免费观看一区二区三区毛片| 三级欧美在线一区| 日韩欧美亚洲日产国产| 欧美暴力调教| 中文字幕无线精品亚洲乱码一区| 日韩精选在线观看| 国产精品国产自产拍高清av王其 | 日本成人性视频| 成人国产精品久久| 欧美激情精品在线| 国产精品国产高清国产| 一本大道综合伊人精品热热| 国产毛片久久久久久久| 国语自产精品视频在线看8查询8| 99精彩视频在线观看免费| 福利小视频在线| 亚洲精品自拍偷拍| 中文字幕91爱爱| 国产精品久久久久久一区二区三区| 久久久精品高清| 午夜日本精品| 麻豆蜜桃91| 国产精品久久久久久久久久齐齐| 久久亚洲精品一区二区| 蜜桃91麻豆精品一二三区| 婷婷开心久久网| 最新中文字幕av| 国产一区二区三区美女| 无码专区aaaaaa免费视频| 欧美综合视频| 国产精品国产亚洲精品看不卡15| 欧美大胆成人| 大胆欧美人体视频| 日本视频在线观看一区二区三区| 欧美亚洲综合久久| 久久久久人妻一区精品色欧美| 99久久婷婷国产综合精品电影| 久久久久久三级| 欧美三级免费| 亚洲 国产 日韩 综合一区| 人妻熟人中文字幕一区二区| 99在线精品视频在线观看| 四虎永久国产精品| 粉嫩的18在线观看极品精品| 国产精品高精视频免费| 黄色美女视频在线观看| 在线观看日韩av| 性生活黄色大片| 欧美亚洲高清一区二区三区不卡| 久久国产精品波多野结衣| 久久精品欧美日韩| 亚洲欧美高清在线| 极品尤物av久久免费看| 一本大道熟女人妻中文字幕在线| 亚洲不卡av不卡一区二区| 欧美精品在线一区| 成人搞黄视频| 成人xvideos免费视频| 亚洲欧洲美洲av| 久久久综合av| 中文字幕伦理免费在线视频| 夜夜嗨av色一区二区不卡| 涩涩视频免费看| 日韩一区二区三区观看| 中文字幕永久在线视频| 欧美日韩性视频| 久久中文字幕无码| 亚洲天堂av一区| 丁香六月激情综合| 久久久无码精品亚洲日韩按摩| 日本50路肥熟bbw| 国产曰批免费观看久久久| 日本www.色| 久久久亚洲一区| 亚洲国产精品久久久久婷蜜芽| 在线不卡视频| av在线免费观看国产| 欧美国产高潮xxxx1819| 亚洲免费av网| 欧美电影《轻佻寡妇》| 婷婷久久伊人| 精品高清在线| 日韩国产高清一区| 欧美日韩国产在线观看网站| 免费看成人av| 国产成人手机高清在线观看网站| 久久久久久99| 日本一区福利在线| 久久人人九九| 一区二区三区日本久久久| 久久久99爱| 国产91久久精品一区二区| 久久伊人一区| 中文字幕av一区二区三区人| 欧美精品123| 国产欧美日韩影院| 青娱乐一区二区| 免费在线看黄网址| 久久久综合视频| 六月婷婷七月丁香| 国产日韩v精品一区二区| 欧美xxxx精品| 亚洲少妇30p| 久久久久久久久久久网| 亚洲va在线va天堂| 五月天综合激情网| 日韩欧美在线字幕| 久久久久久无码精品大片| 欧美日韩一区 二区 三区 久久精品| 一级全黄裸体免费视频| 日韩一区二区免费视频| 黑人操亚洲女人| 亚洲美女www午夜| gogogo高清在线观看免费完整版| 色偷偷88888欧美精品久久久| 黄色网址免费在线观看| 色综合天天狠天天透天天伊人| av日韩中文| 国产精品久久久久久久久久久新郎 | 午夜精品福利电影| 日日av拍夜夜添久久免费| 91精品国产综合久久香蕉| 亚洲一区电影| 欧美日韩中文国产一区发布 | 日韩午夜在线视频| 婷婷av在线| 国产成人精品最新| 国产精品3区| 蜜桃999成人看片在线观看| 91一区二区| 野外做受又硬又粗又大视频√| 乱码第一页成人| 两女双腿交缠激烈磨豆腐| 97精品电影院| 国产麻豆视频在线观看| 精品二区三区线观看| 国产精品九九九九| 亚洲精品久久久一区二区三区 | 露出调教综合另类| 亚洲一区二区精品在线观看| 亚洲国产日韩欧美一区二区三区| 天堂av在线网站| 成人国产一区二区三区精品| 一级片久久久久| 亚洲成人动漫精品| 97精品久久人人爽人人爽| 亚洲精品国产欧美| 在线不卡日本v二区707| 国产精品xxxxx| 精品久久ai电影| 精品嫩模一区二区三区| 日韩va欧美va亚洲va久久| 91精品人妻一区二区三区四区| 一区二区三区在线电影| 热久久美女精品天天吊色| 欧美成人三级| 欧美重口乱码一区二区| 亚洲性感美女99在线| 亚洲精品综合在线观看| 久久久综合视频| 国产成人无码精品久久久久| 欧美一个色资源| 幼a在线观看| 日本高清视频精品| 欧美做受69| 精品国产av无码一区二区三区| 极品少妇xxxx精品少妇| 亚洲一级理论片| 欧美影院精品一区| 免费a在线观看| 91国内产香蕉| 99a精品视频在线观看| 一级黄色免费在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 国产熟妇久久777777| 色综合天天综合在线视频| 五月天婷婷社区| 午夜精品一区二区三区在线播放| 一区二区三区欧洲区| 麻豆映画在线观看| 国产在线观看免费一区| 99热在线观看精品| 欧美精品在线视频| 日韩av中文| 成人精品一区二区三区电影黑人| 欧美在线免费看视频| 亚洲黄色小视频在线观看| 国产欧美精品一区二区色综合| 国产一级片免费在线观看| 亚洲人成电影网站色| 性感美女一区二区在线观看| 免费国产一区二区| 久久精选视频| 91狠狠综合久久久久久| 欧美视频完全免费看| 日本www在线观看| 亚洲精品欧美日韩| 欧美日本不卡| 国产一线在线观看| 岛国av一区二区| 经典三级在线| 国产精品久久久久久久久影视| 日韩不卡一区| 激情五月婷婷基地| 一区二区三区欧美日| 好吊色一区二区| 91成人免费观看网站| 国产亚洲一卡2卡3卡4卡新区| 午夜两性免费视频| 亚洲免费观看高清完整版在线观看熊 | 成人在线播放免费观看| 成人av免费看| 国产欧美一区二区色老头| 日本性高潮视频| 欧美剧情片在线观看| 天天干在线视频论坛| 久久久久久亚洲精品不卡4k岛国 | 国产在线播放不卡| 欧美久久一级| 少妇特黄一区二区三区| 欧美亚洲国产怡红院影院| 超碰个人在线| 精品无人区一区二区三区 | 国产精品福利观看| 亚洲一区二区| 懂色av粉嫩av蜜乳av| 欧美三级电影精品| av文字幕在线观看| 国内精品久久国产| 日韩av不卡一区二区| 男人的天堂久久久| 亚洲理论在线a中文字幕| 欧美xxxx性| 丁香六月激情网| 欧美激情一区二区在线| 精品国产乱码一区二区三 | 精品三级久久久| 免费在线观看的av网站| 亚洲女同ⅹxx女同tv| 日韩av地址| 99在线观看| 日韩二区在线观看| 国产稀缺真实呦乱在线| 色综合伊人色综合网|