TypeScript中類型映射的使用
1. 簡(jiǎn)介
映射就是將一種類型按照映射規(guī)則,轉(zhuǎn)成另一種類型,通常用于對(duì)象類型。
這里類型B通過(guò)A采用屬性名索引的寫法,完成了類型B的定義
type A = { foo: number; bar: number; }; type B = { [prop in keyof A]: string; };
這里復(fù)制了一個(gè)一樣的類型,類型B
原樣復(fù)制了類型A
type A = { foo: number; bar: string; }; type B = { [prop in keyof A]: A[prop]; };
為了增加代碼復(fù)用性,可以把常用的映射寫成泛型。
這里定義了一個(gè)泛型,可以將其他對(duì)象的所有屬性值都改成 boolean 類型。
type ToBoolean<Type> = { [Property in keyof Type]: boolean; };
不使用聯(lián)合類型,直接使用某種具體類型進(jìn)行屬性名映射,也是可以的。
type MyObj = { [p in 'foo']: number; }; // 等同于 type MyObj = { foo: number; };
上面示例中,p in 'foo'
可以看成只有一個(gè)成員的聯(lián)合類型,因此得到了只有這一個(gè)屬性的對(duì)象類型。
通過(guò)映射,可以把某個(gè)對(duì)象的所有屬性改成可選屬性。比如ts 的內(nèi)置工具類型Partial<T>
,就是這樣實(shí)現(xiàn)的。
type A = { a: string; b: number; }; type B = { [Prop in keyof A]?: A[Prop]; };
上面示例中,類型B
在類型A
的所有屬性名后面添加問(wèn)號(hào),使得這些屬性都變成了可選屬性。
ts內(nèi)置的工具類型Readonly<T>
可以將所有屬性改為只讀屬性,實(shí)現(xiàn)也是通過(guò)映射。
// 將 T 的所有屬性改為只讀屬性 type Readonly<T> = { readonly [P in keyof T]: T[P]; }; // 用法如下。 type T = { a: string; b: number }; type ReadonlyT = Readonly<T>; // { // readonly a: string; // readonly b: number; // }
2. 映射修飾符
映射會(huì)原樣復(fù)制原始對(duì)象的可選屬性和只讀屬性,如果想要?jiǎng)h除可選和只讀這兩個(gè)特性,并不太方便,所以為了解決這個(gè)問(wèn)題,ts引入了兩個(gè)修飾符,用來(lái)移除映射時(shí)添加或移除可選屬性或者只讀屬性。
+
修飾符:寫成+?
或+readonly
,為映射屬性添加?
修飾符或readonly
修飾符。–
修飾符:寫成-?
或-readonly
,為映射屬性移除?
修飾符或readonly
修飾符。
這里添加、移除了可選屬性,+?
或-?
要寫在屬性名的后面
// 添加可選屬性 type Optional<Type> = { [Prop in keyof Type]+?: Type[Prop]; }; // 移除可選屬性 type Concrete<Type> = { [Prop in keyof Type]-?: Type[Prop]; };
這里添加、移除只讀屬性,+readonly
和-readonly
要寫在屬性名的前面。
// 添加 readonly type CreateImmutable<Type> = { +readonly [Prop in keyof Type]: Type[Prop]; }; // 移除 readonly type CreateMutable<Type> = { -readonly [Prop in keyof Type]: Type[Prop]; };
如果同時(shí)增刪?
和readonly
這兩個(gè)修飾符,寫成下面這樣。
// 增加 type MyObj<T> = { +readonly [P in keyof T]+?: T[P]; }; // 移除 type MyObj<T> = { -readonly [P in keyof T]-?: T[P]; }
ts 原生的工具類型Required<T>
專門移除可選屬性,就是使用-?
修飾符實(shí)現(xiàn)的。
另外,–?
修飾符移除了可選屬性以后,該屬性就不能等于undefined
了,實(shí)際變成必選屬性了。但是,這個(gè)修飾符不會(huì)移除null
類型。
另外,+?
修飾符可以簡(jiǎn)寫成?
,+readonly
修飾符可以簡(jiǎn)寫成readonly
。
3. 鍵名重映射
1. 語(yǔ)法
ts4.1引入了鍵名重映射,允許改變鍵名,就是在鍵名映射的后面加上as +新類型字句,新類型字句一般是模板字符串,用來(lái)對(duì)原鍵名的操作。
type A = { foo: number; bar: number; }; type B = { [p in keyof A as `${p}ID`]: number; }; // 等同于 type B = { fooID: number; barID: number; };
上面示例中,類型B
是類型A
的映射,但在映射時(shí)把屬性名改掉了,在原始屬性名后面加上了字符串ID
。
可以看到,鍵名重映射的語(yǔ)法是在鍵名映射的后面加上as + 新類型
子句。這里的“新類型”通常是一個(gè)模板字符串,里面可以對(duì)原始鍵名進(jìn)行各種操作。
2. 屬性過(guò)濾
鍵名重映射可以過(guò)濾某些屬性。
3. 聯(lián)合類型的映射
因?yàn)殒I名重映射可以修改鍵名類型,所以原始鍵名的類型不必是string|number|symbol
,任意的聯(lián)合類型都可以用來(lái)進(jìn)行鍵名重映射。
type S = { kind: 'square', x: number, y: number, }; type C = { kind: 'circle', radius: number, }; type MyEvents<Events extends { kind: string }> = { [E in Events as E['kind']]: (event: E) => void; } type Config = MyEvents<S|C>; // 等同于 type Config = { square: (event:S) => void; circle: (event:C) => void; }
上面示例中,原始鍵名的映射是E in Events
,這里的Events
是兩個(gè)對(duì)象組成的聯(lián)合類型S|C
。所以,E
是一個(gè)對(duì)象,然后再通過(guò)鍵名重映射,得到字符串鍵名E['kind']
。
到此這篇關(guān)于TypeScript中類型映射的使用的文章就介紹到這了,更多相關(guān)TypeScript 類型映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
layui.js實(shí)現(xiàn)的表單驗(yàn)證功能示例
這篇文章主要介紹了layui.js實(shí)現(xiàn)的表單驗(yàn)證功能,結(jié)合實(shí)例形式分析了基于layui.js的事件監(jiān)聽、驗(yàn)證、判定等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11js獲取url頁(yè)面id,也就是最后的數(shù)字文件名
這篇文章主要介紹了js獲取url頁(yè)面id,也就是最后的數(shù)字文件名,有時(shí)候我們需要判斷當(dāng)前頁(yè)面的id,又不用重新生成頁(yè)面直接用js獲取最后的數(shù)字.htm即可2020-09-09利用JavaScript實(shí)現(xiàn)ISO周日歷
周日歷是日常生活中不常用到的歷法系統(tǒng),一般用于政府、商務(wù)的會(huì)計(jì)年度或者學(xué)校教學(xué)日歷中。本文將利用JavaScript制作個(gè)簡(jiǎn)單的周日歷,感興趣的可嘗試一下2022-07-07avalon js實(shí)現(xiàn)仿google plus圖片多張拖動(dòng)排序附源碼下載
這篇文章主要介紹了avalon js實(shí)現(xiàn)仿google plus圖片多張拖動(dòng)排序附源碼下載的相關(guān)資料,需要的朋友可以參考下2015-09-09JavaScript:new 一個(gè)函數(shù)和直接調(diào)用函數(shù)的區(qū)別分析
或許許多人對(duì)此不以為然,在函數(shù)前加 new 關(guān)鍵字,不就是實(shí)例化一個(gè)對(duì)象嗎?但事情顯然沒那么簡(jiǎn)單2013-07-07極力推薦10個(gè)短小實(shí)用的JavaScript代碼段
這篇文章主要為大家極力推薦10個(gè)短小實(shí)用的JavaScript代碼段,幫助大家節(jié)省大量開發(fā)時(shí)間,感興趣的小伙伴們可以參考一下2016-08-08