【TS】1331- 減少 TS 重復(fù)代碼,Omit 用起來(lái)真香!
阿寶哥精心準(zhǔn)備的《輕松學(xué) TypeScript》?視頻教程已經(jīng)更新到第十五期了,通過(guò)形象生動(dòng)的動(dòng)畫(huà),讓你輕松搞懂 TypeScript 的難點(diǎn)和核心知識(shí)點(diǎn)!
你用過(guò) TypeScript 內(nèi)置的 Omit 工具類(lèi)型么?你想知道 Omit 的應(yīng)用場(chǎng)景和內(nèi)部是如何實(shí)現(xiàn)的么?如果想的話,閱讀完本文之后,也許你就懂了。這是一個(gè)使用 type 類(lèi)型別名定義的 User 類(lèi)型,用于描述用戶(hù)對(duì)象。
type?User?=?{
??id:?string;?//?用戶(hù)id
??name:?string;?//?用戶(hù)名
??password:?string;?//?密碼
??createdAt:?Date;?//?創(chuàng)建時(shí)間
??updatedAt:?Date;?//?更新時(shí)間
};
其中 id、createdAt 和 updatedAt 這些屬性是在創(chuàng)建用戶(hù)時(shí),由服務(wù)端自動(dòng)生成的。因此在注冊(cè)用戶(hù)時(shí),用于描述注冊(cè)用戶(hù)對(duì)象的 RegisterUser 類(lèi)型并不需要以上這些屬性。那么我們應(yīng)該如何高效地定義 RegisterUser 類(lèi)型呢?這時(shí)我們可以使用 TS 內(nèi)置的 Omit 工具類(lèi)型。
type?RegisterUser?=?Omit"id"?|?"createdAt"?|?"updatedAt">;
type?RegisterUser?=?{
????name:?string;
????password:?string;
}

由以上結(jié)果可知,id、createdAt 和 updatedAt 這些屬性都已經(jīng)被過(guò)濾掉了,所以使用 Omit 工具類(lèi)型,我們可以很方便地過(guò)濾掉對(duì)象類(lèi)型中不需要的屬性。
其實(shí) Omit 工具類(lèi)型還有其它的作用,比如我們可以利用接口繼承的方式來(lái)實(shí)現(xiàn)覆蓋已有對(duì)象類(lèi)型中已知屬性的類(lèi)型。具體的實(shí)現(xiàn)方式也很簡(jiǎn)單:
interface?UserUI?extends?Omit?{
??createdAt:?string;
??updatedAt:?string;
}
在以上代碼中,UserUI 接口描述的對(duì)象用于在頁(yè)面上顯示用戶(hù)信息,所以我們把原有 User 類(lèi)型中 createdAt 和 updatedAt 屬性的類(lèi)型都修改成 string 類(lèi)型。
了解完 Omit 工具類(lèi)型的應(yīng)用場(chǎng)景,下面我們來(lái)看一下它內(nèi)部是如何實(shí)現(xiàn)的。
//?typescript/lib/lib.es5.d.ts
type?Omitextends?keyof?any>?=?Pick>;

由以上代碼可知,Omit 工具類(lèi)型內(nèi)部使用了 TS 內(nèi)置的 Pick 和 Exclude 工具類(lèi)型。
其中 keyof 操作符用于獲取某種類(lèi)型中的所有鍵,其返回類(lèi)型是聯(lián)合類(lèi)型。而 Exclude 工具類(lèi)型用于實(shí)現(xiàn)類(lèi)型過(guò)濾,即從 keyof ?T 返回的聯(lián)合類(lèi)型中,過(guò)濾掉要排除的屬性。最終再使用 Pick 工具類(lèi)型從原有的對(duì)象類(lèi)型中,挑選出需保留的屬性,組合成新的對(duì)象類(lèi)型。
掃碼查看?輕松學(xué) TypeScript?系列視頻教程

(目前已更新?15?期)
看完 Omit 工具類(lèi)型的具體實(shí)現(xiàn),你有沒(méi)有發(fā)現(xiàn) Omit 和 Pick 這兩個(gè)工具類(lèi)型是互補(bǔ)的。如果你對(duì) Pick 工具類(lèi)型還不了解的話,可以觀看 “聽(tīng)說(shuō)你熟悉 Pick,那就來(lái)手寫(xiě)一個(gè) MyPick!” 這一期的視頻。
類(lèi)型體操專(zhuān)題已經(jīng)開(kāi)始了,一起學(xué)起來(lái)吧!你喜歡以這種形式學(xué) TS 么?喜歡的話,記得點(diǎn)贊與收藏喲。
