精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

精品毛片乱码1区2区3区| 国产精品国产精品国产专区不蜜| 欧美激情一区二区三级高清视频| 人妖粗暴刺激videos呻吟| 午夜影院在线观看国产主播| 国产欧美精品国产国产专区| 亚洲在线观看视频| 久久精品视频5| 国产精品九九| 夜夜嗨av色一区二区不卡| 三级性生活视频| 老牛影视精品| 亚洲乱码中文字幕| 久久久久久亚洲精品不卡4k岛国 | 91搞黄在线观看| 国产一区一区三区| 色天堂在线视频| 精东粉嫩av免费一区二区三区| 久久久久亚洲精品| 一级免费黄色录像| 欧美精美视频| 亚洲黄色www网站| 在线观看免费av网址| 亚洲伊人av| 亚洲午夜精品久久久久久久久| 天天综合狠狠精品| 人妻丰满熟妇av无码区hd| 久久精品国产在热久久| 茄子视频成人在线| 久久久久香蕉视频| 亚洲国产精品久久久久蝴蝶传媒| 亚洲免费av网址| 国产精品无码自拍| 成人影院网站ww555久久精品| 一本色道亚洲精品aⅴ| 青青草国产免费| 国产精品久久麻豆| 国产欧美一区二区在线观看| 国产综合 伊人色| a级片在线播放| 久久精品免费观看| 国产精品国产三级国产专播精品人| 日本三级黄色大片| 国产精品mv在线观看| 久久国产精品影片| 小泽玛利亚一区| 99久久99热这里只有精品| 亚洲人成欧美中文字幕| 精品人妻一区二区三区日产乱码卜| 久久精品一级| 日韩一区二区在线看| 两性午夜免费视频| 免费欧美网站| 日韩精品一区二区三区在线播放 | 大荫蒂性生交片| a篇片在线观看网站| 亚洲欧洲另类国产综合| 一区二区在线观| 欧美18hd| 亚洲另类在线制服丝袜| 久久久久久久久网| 性欧美ⅴideo另类hd| 亚洲午夜羞羞片| 日本丰满少妇xxxx| 在线能看的av网址| 色综合久久中文字幕综合网| 激情视频综合网| 桃花岛tv亚洲品质| 欧美日韩一区不卡| 99中文字幕在线| youjizz欧美| 日韩成人av在线| 大又大又粗又硬又爽少妇毛片| 亚洲人成网www| 中文字幕精品久久久久| 疯狂撞击丝袜人妻| 国产精品sm| 91国产美女视频| 69亚洲精品久久久蜜桃小说| 日本欧美韩国一区三区| 成人网欧美在线视频| 亚洲大尺度网站| 26uuu色噜噜精品一区| 日本一区二区三区视频免费看| 免费黄色在线网站| 亚洲资源中文字幕| 999香蕉视频| 四虎在线精品| 亚洲精品99久久久久| xxxx日本黄色| 欧美激情视频一区二区三区免费| 91高清在线免费观看| 中文字幕网址在线| 国产成人亚洲综合a∨婷婷| 久热国产精品视频一区二区三区| 日韩免费网站| 午夜欧美视频在线观看 | 日本三级欧美三级| 日本欧美一区二区在线观看| 成人在线视频网址| 国产小视频福利在线| 一区二区三区在线高清| 熟妇人妻va精品中文字幕| 精品久久亚洲| 亚洲欧洲中文天堂| 久草视频在线资源站| 日韩制服丝袜先锋影音| 国产美女精品视频免费观看| 国产自产一区二区| 国产精品久久毛片a| 国产原创中文在线观看| 国产激情综合| 中文字幕av一区二区| 日韩字幕在线观看| 国产精品综合在线视频| 亚洲va韩国va欧美va精四季| 久草免费在线色站| 欧美二区三区91| a毛片毛片av永久免费| 欧美日韩91| 国产美女被下药99| 黄网站在线观看| 亚洲成人精品一区二区| 国产永久免费网站| 精品日本12videosex| 7777精品久久久久久| 亚洲成人一级片| 中文字幕综合网| 熟女人妇 成熟妇女系列视频| 国产精品宾馆| 色综合色综合网色综合| 国产精品系列视频| 国产精品久久久久影院亚瑟 | 亚洲人成网站在线观看播放| 日本蜜桃在线观看视频| 精品va天堂亚洲国产| 91嫩草|国产丨精品入口| 日本一不卡视频| 欧美一区二区福利| a一区二区三区| 亚洲精品国偷自产在线99热| 国产精品99无码一区二区| 国产最新精品精品你懂的| 亚洲精品成人a8198a| 无人区在线高清完整免费版 一区二 | 日韩在线www| 中文字幕在线视频第一页| 国产欧美日韩一区二区三区在线观看 | 91精品国产综合久久久久久丝袜 | 一区二区三区入口| av资源久久| 国产精品久久久久av| 国产区av在线| 欧美在线高清视频| 欧美人妻一区二区三区| 日韩电影在线一区二区| 视频一区视频二区视频三区视频四区国产 | 婷婷开心久久网| 国产福利短视频| 久久久久欧美精品| 天堂社区 天堂综合网 天堂资源最新版| 欧美成人h版| 国产一区二区日韩| 亚洲一区二区视频在线播放| 国产精品国产自产拍高清av| 在线观看av免费观看| 欧美精品18| 精品视频在线观看| 搜成人激情视频| 日韩专区在线播放| 精品国产乱码一区二区三| 亚洲一区二区三区四区在线免费观看 | 久久精品影视伊人网| 国产精品久久777777换脸| 一区二区免费在线| 最近中文字幕无免费| 久久久久久黄| 国产成人免费高清视频| 成人中文字幕视频| 日韩美女视频免费在线观看| 午夜免费视频在线国产| 欧美xxxxxxxxx| 91video| 亚洲欧美在线aaa| 国产 xxxx| 免费成人美女在线观看| 国产尤物av一区二区三区| 亚洲区小说区图片区qvod按摩| 国产精品视频网址| 182在线视频观看| 永久555www成人免费| 精品人妻一区二区三区含羞草| 精品magnet| www日韩在线| 91丨porny丨蝌蚪视频| 2025韩国理伦片在线观看| 激情欧美日韩| 亚洲欧洲中文| 日韩高清一级| 91九色国产社区在线观看| 日韩大片免费观看| 九九久久国产精品| 国产福利小视频在线| 精品粉嫩超白一线天av| 亚洲天天综合网| 狠狠躁夜夜躁久久躁别揉| 神马久久精品综合| 久久精品夜色噜噜亚洲a∨| 一个人看的视频www| 日韩二区在线观看| 99爱视频在线| 韩国亚洲精品| 最近中文字幕免费mv| 国产精品免费大片| 国产精品视频入口| 精品国模一区二区三区欧美 | 久久九九亚洲综合| 日色在线视频| 亚洲国产私拍精品国模在线观看| 97超碰资源站| 欧美综合一区二区| av大片免费观看| 亚洲一线二线三线久久久| 三上悠亚在线观看视频| 国产亚洲视频系列| 国产伦精品一区三区精东| 国产精品一级在线| 中文字幕精品一区二区三区在线| 久久久久国产精品一区三寸 | 久久99国产精品免费| 免费在线观看毛片网站| 国产精品毛片在线看| 欧洲精品一区二区三区久久| 欧美~级网站不卡| 超碰成人在线免费观看| 99精品在线| 亚洲国产日韩欧美| 青草国产精品| 涩涩涩999| 欧美色婷婷久久99精品红桃| 欧美激情第六页| 少妇精品久久久一区二区| 久久婷婷国产综合尤物精品| 欧美a一欧美| 久久一区二区精品| 亚洲+变态+欧美+另类+精品| 极品尤物一区二区三区| 欧美综合精品| 欧美日韩一区在线播放| 久久超碰99| 奇米精品在线| 精品国产一区一区二区三亚瑟 | 一区二区三区中文| 免费国产成人看片在线| 伊人久久大香线| 成人小视频在线观看免费| 国产一区日韩欧美| 18岁网站在线观看| 丝袜脚交一区二区| 一起操在线视频| 国产一区亚洲一区| 911亚洲精选| 久久久久九九视频| 婷婷国产成人精品视频| 亚洲日本乱码在线观看| 久久久久久天堂| 午夜精品一区二区三区免费视频 | 欧美丰满美乳xxx高潮www| 国产伦一区二区| 亚洲成人av中文字幕| 免费a在线观看| 中文字幕在线视频日韩| av片在线观看| 91精品国产高清久久久久久久久| 日韩电影免费观看高清完整版| 国产精品免费一区豆花| 国产亚洲字幕| 久久精品久久精品国产大片| 欧美熟乱15p| 激情五月婷婷六月| 久久伊人亚洲| 青娱乐国产精品视频| 99久久er热在这里只有精品15| 黄色片网站免费| 亚洲愉拍自拍另类高清精品| 精产国品一区二区| 欧美一区二区三区色| 嫩草精品影院| 久久精品视频亚洲| 暖暖成人免费视频| 亚洲自拍偷拍第一页| 亚洲欧美日本伦理| 一本大道东京热无码aⅴ| 美女精品在线观看| 久久综合在线观看| 久久精品综合网| 欧美久久久久久久久久久久| 色哟哟一区二区| 精品国产无码一区二区| 亚洲一区二区久久| 国产偷倩在线播放| 91精品久久久久久久久青青| 六月丁香久久丫| 久久精品在线免费视频| 日本欧美一区二区| 人妻在线日韩免费视频| 亚洲男人天堂一区| 国语对白做受69按摩| 亚洲第一区中文字幕| 国产在线1区| 国产精品国产三级国产aⅴ浪潮| 成人在线超碰| 国产一级片91| 美国三级日本三级久久99| 自拍偷拍中文字幕| 亚洲3atv精品一区二区三区| 国产精品一区二区免费视频| 伊人青青综合网站| 丝袜美腿诱惑一区二区三区| 久久96国产精品久久99软件| 国产精品激情电影| 久久久久久久久久久影视| 国产精品每日更新| 综合久久中文字幕| 亚洲网在线观看| 在线天堂资源www在线污| 动漫一区二区在线| 欧美在线首页| 在线a免费观看| 国产精品久久福利| 欧美激情一区二区三区免费观看| 国产婷婷成人久久av免费高清 | 欧亚乱熟女一区二区在线| 一区二区理论电影在线观看| a天堂在线视频| 欧美理论片在线观看| 精品亚洲二区| 女人床在线观看| 国产精品自拍毛片| 免费在线观看黄色小视频| 欧美日本在线一区| 黄页视频在线播放| 亚洲a中文字幕| 午夜精品视频| 中文在线字幕观看| 亚洲午夜在线电影| 神马午夜精品95| 51视频国产精品一区二区| 妖精视频一区二区三区免费观看| 黄色一级片播放| 国产三级欧美三级日产三级99| 国产精品久久久久久人| 亚洲性夜色噜噜噜7777| 日本精品网站| 熟妇熟女乱妇乱女网站| 国产精品1区2区3区在线观看| 免看一级a毛片一片成人不卡| 精品免费日韩av| 韩国精品一区| 欧美一区二区三区四区五区六区| 日本aⅴ免费视频一区二区三区 | 国产欧美一区二区三区久久人妖| 日韩综合网站| 国产精品熟女一区二区不卡| 亚洲成人手机在线| 欧美老女人性开放| 国产原创欧美精品| 黄色精品网站| 免费看污片网站| 欧美猛男男办公室激情| 午夜激情在线| 乱一区二区三区在线播放| 日韩av在线发布| 国产盗摄x88av| 亚洲美女av电影| 亚洲午夜剧场| 国产原创popny丨九色 | 日韩中文一区| 国产一区二区三区蝌蚪| 精品无码人妻一区二区三区品| 日韩成人在线播放| 国产激情久久| 美脚丝袜脚交一区二区| 国产日韩高清在线| 精品久久人妻av中文字幕| 欧美在线不卡区| 亚洲va在线| 人妻丰满熟妇av无码久久洗澡| 欧美美女bb生活片| 国产99在线观看| 亚洲无玛一区| 97久久人人超碰| 96日本xxxxxⅹxxx17| 欧美在线精品免播放器视频| 天天精品视频| 国产美女永久免费无遮挡| 日韩免费性生活视频播放| 日韩免费小视频| xxxx18hd亚洲hd捆绑| 国产精品久久久久一区|