成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Typescript 一些令人又愛又恨的內(nèi)容 — Type Guard、Narrowing

開發(fā) 前端
今天介紹了 TypeScript 中用來檢查類型的方法,假如讀者日后遇到類似這種問題不妨可以多加利用 Type Guard 進(jìn)行檢查。

本文已經(jīng)過授權(quán)發(fā)布。

由于 JavaScript 本身是弱語言,因此在開發(fā)上常因?yàn)椴恢雷兞康念愋褪鞘裁炊械娇鄲溃词菇栌擅姆绞阶屪兞康亩ㄎ簧晕⒚鞔_一點(diǎn),我們還是很難一眼就知道他的類型甚至當(dāng)此變量是一個(gè) object 時(shí)我們更難知道里面有哪些 key,因此大家漸漸開始使用 TypeScript 作為主要的開發(fā)工具。

不曉得大家在利用 TypeScript 進(jìn)行開發(fā)時(shí),有沒有覺得 TypeScript 在檢查類型這塊特別惱人,雖然知道這些類型檢查的舉動(dòng)是非常好的,可以幫助我們減少許多可能會(huì)發(fā)生的潛在錯(cuò)誤,今天就要來談?wù)劗?dāng)我們?cè)陂_發(fā)上遇到這種問題時(shí)該如何解決。

場(chǎng)景一

不曉得大家有沒有遇過這種問題,今天想要讓這個(gè)變量查看是否符合 enum 中的某一個(gè)值,結(jié)果 TypeScript 就噴錯(cuò)給你看了,像下面這樣。

其實(shí)要解決上面的紅字方法非常多,首先是開大絕使用 @ts-ignore 讓錯(cuò)誤消失,當(dāng)然這個(gè)方法非常不好,等于是叫 TypeScript 不要檢查下面這行了。

這時(shí)候可能會(huì)想到另一個(gè)方法,上面的錯(cuò)誤信息是說 male 沒有被 assign 到 GENDER 這個(gè) type,所以我只要強(qiáng)制塞給他這個(gè) type 就好,就像這樣:

可是這樣寫仍然不好,等于你強(qiáng)制轉(zhuǎn)變這個(gè)變量了,讓這個(gè)變量失去了彈性,接下來我們介紹比較好用的方法,就讓我們繼續(xù)看下去吧!

Type Guard

首先要介紹的是 Type Guard,Type Guard 顧名思義就是類型的看守者,剛剛 TypeScript 會(huì)報(bào)錯(cuò)就是因?yàn)? type 不一樣,所以只要我們建立一個(gè)類型的看守者,讓 TypeScript 知道這個(gè)變量一定會(huì)符合我 enum 中的某一個(gè) value 時(shí),這時(shí)候就不會(huì)出現(xiàn)紅字了,而通常 Type Guard 會(huì)寫成一個(gè) function 像這樣:

const assertsIsGender = (gender: any) : gender is GENDER => {
return Object.values(GENDER).includes(gender)
}

這時(shí)候我們可以發(fā)現(xiàn) gender 這個(gè)變量已經(jīng)從 string type 變成 GENDER type 了,所以即便我很無聊的再做一次 includes 的判斷 TypeScript 也不會(huì)報(bào)任何錯(cuò)誤了。

這邊我在指定 gender 這個(gè)值之前先指派這個(gè)變量是一個(gè) string type,這個(gè)動(dòng)作很重要,如果沒有先指派變量類型再給值的話這個(gè)變數(shù)就沒辦法順利改變 type 了。

場(chǎng)景二

不曉得大家有沒有遇過在 API 回傳的資料,也會(huì)因?yàn)橘Y料對(duì)應(yīng)到的 enum 的值不同而發(fā)生錯(cuò)誤,像下面這樣:

有了上面 Type Guard 的觀念后,這時(shí)候的讀者一定知道要寫一個(gè) function 來處理這段錯(cuò)誤信息:

的確錯(cuò)誤信息沒有了,但很奇怪的是 gender 竟然變成 never type 了,而這個(gè)就是 Type Guard 會(huì)做到的一個(gè)類型保護(hù)機(jī)制叫:Narrowing。

類型收窄(Narrowing)

Narrowing 翻成白話文就是類型收窄,在 TypeScript 的世界中每一個(gè) enum 基本上都是獨(dú)立存在彼此之間是沒有交集的,關(guān)系圖就像下面這樣:

所以要進(jìn)行兩個(gè) enum 間的類型轉(zhuǎn)換就很容易產(chǎn)生出一個(gè)可能不會(huì)存在的型別,對(duì)于可能不會(huì)存在的類別 TypeScript 把這個(gè)型別定義為 never,而這時(shí)候當(dāng)我們使用了 Type Guard 的技巧,TypeScript 就會(huì)自動(dòng)把類型收窄成 never type,而不是自動(dòng)轉(zhuǎn)換成另一個(gè) enum 了。

當(dāng)然聰明的你可能會(huì)這樣想:那我只要把 function return 定義成另一個(gè) enum 不就好了,這樣就可以確保我 Type Guard 的結(jié)果一定會(huì)類型轉(zhuǎn)換成我想要的 enum,像下面這樣:

這樣寫看起來的確沒有什麼問題,我們想要的結(jié)果也從類型收窄變成了類型轉(zhuǎn)換,但這樣做其實(shí)就有點(diǎn)不太符合 Type Guard 的精神,畢竟 Type Guard 要做的是類型檢查而不是類型轉(zhuǎn)換,而且假如我們要做的是類型轉(zhuǎn)換,這樣寫也會(huì)讓這個(gè) function 的復(fù)用性不高,因此我們接下來要介紹比較好的類型轉(zhuǎn)型方法。

Mapper enum

首先我們可以先想想如何讓類型轉(zhuǎn)換這件事被復(fù)用,我們不妨把想法簡(jiǎn)單化,就是建立一個(gè) function 把 A 型態(tài)轉(zhuǎn)換成 B 型態(tài),而這時(shí)候就必須要利用 TypeScript 中的 Generics 泛型這個(gè)技巧了,像下面這樣:

const createEnumMapper = <T>(mapping: T) => (value: keyof T | null) : T[keyof T] | undefined => {
return value === null ? undefined : mapping[value]
}

這個(gè) createEnumMapper 的 function 是一個(gè) currying function,第一個(gè)變數(shù)傳入的是 enum 本身,這時(shí)候 TypeScript 的 Generics 就會(huì)知道我的 T 就是跟 enum 本身有關(guān)。

為了讓這個(gè) Generics 可以正確的把兩個(gè) enum mapping起來,我們必須要先建立一個(gè) object 把兩個(gè) enum 的key value配對(duì)像下面這樣:

const mapper = {
[BE_GENDER.MALE]: FE_GENDER.MALE,
[BE_GENDER.FEMALE]: FE_GENDER.FEMALE
}

由于我們上面的 mapper 是把 enum 的 value 當(dāng)成 key,所以我們只要帶入 data 的值就可以直接轉(zhuǎn)換了,像下面這樣:

這時(shí)候就可以發(fā)現(xiàn)我們成功的把 BE_GENDER type 的值轉(zhuǎn)成 FE_GENDER type 的值了,而且也不需要?jiǎng)佑玫?Type Guard 的觀念。

總結(jié)

今天介紹了 TypeScript 中用來檢查類型的方法,假如讀者日后遇到類似這種問題不妨可以多加利用 Type Guard 進(jìn)行檢查,而不是直接開大絕用 @ts-ignore 或者 as 這兩種方法,除了介紹類型檢查外也介紹了如何進(jìn)行類型轉(zhuǎn)換,希望這些方法都可以讓讀者未來在使用上都不會(huì)有太多的問題。

責(zé)任編輯:姜華 來源: 大遷世界
相關(guān)推薦

2013-12-06 10:11:48

Windows 8Windows 7Windows 8.1

2022-03-04 12:09:25

SQL數(shù)據(jù)量多表查詢

2014-12-04 09:58:59

PHP

2019-08-06 08:47:18

運(yùn)營商流量套餐4G服務(wù)

2019-11-19 15:08:47

Tomcat服務(wù)器底層

2011-10-18 09:35:28

虛擬化瘦客戶端Windows Thi

2019-11-25 11:24:09

技術(shù)周刊

2020-02-27 21:37:33

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)應(yīng)用

2023-07-18 19:11:21

配置信令系統(tǒng)

2014-03-19 15:41:21

編程語言編程規(guī)則

2020-11-09 16:00:26

LinuxLinux內(nèi)核

2014-08-25 09:59:54

注解Android

2021-04-09 09:20:10

Windows 10微軟瀏覽器

2017-12-01 10:05:59

C++編程開發(fā)

2023-02-13 14:37:46

ChatGPT人工智能

2014-06-20 14:47:08

2020-03-10 20:06:38

釘釘微博熱搜

2021-11-12 11:31:27

數(shù)據(jù)結(jié)構(gòu)算法貪心解法

2021-09-09 18:12:22

內(nèi)存分段式網(wǎng)絡(luò)

2014-07-23 10:19:02

小米4
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产成人精品免高潮在线观看 | 国产精品久久久久无码av | av网站在线播放 | 国产精品三级 | 国产成人黄色 | 成年人在线视频 | 久久天天躁狠狠躁夜夜躁2014 | 9久久婷婷国产综合精品性色 | 毛片一区二区三区 | 国产成人精品综合 | 一二区视频 | 免费一区二区 | 国产在线97 | 北条麻妃一区二区三区在线视频 | 欧美大片一区 | 韩国成人在线视频 | 麻豆hd | 免费a网| 欧美精品一区二区三区蜜桃视频 | 久久夜视频 | 欧美日高清 | aaaaa毛片| 精品九九在线 | 狠狠干av| 欧美极品在线 | 亚洲色图综合 | 综合网在线| 国产99久久 | 日本大香伊一区二区三区 | 国产精品1 | 在线看91 | 欧美一区二区三区在线看 | 欧美a在线 | 久久久精品网站 | 91在线精品一区二区 | 欧美日韩中文字幕 | 欧美四虎| 日韩理论电影在线观看 | 伊人精品一区二区三区 | 国色天香综合网 | 亚洲二区在线 |