国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

實現TypeScript中的互斥類型

開發 前端
在TypeScript中它有一個特殊的類型never,它是所有類型的子類型,無法再進行細分,也就意味著除了其本身沒有類型可以再分配給它。

前置知識

在實現之前,我們需要先來了解幾個基礎的知識。

對象中多屬性同類型的定義

有一個對象它包含5個可選屬性a、b、c、d、e,他們的類型都為string,大多數人的定義方式應該如下所示:

type obj = {
a?:string;
b?:string;
c?:string;
d?:string;
e?:string;
}

那么,有沒有更好的方式呢??,答案是有的,請看我的表演:

type obj = { [P in "a" | "b" | "c" | "d" | "e"]?: string };

never類型

在TypeScript中它有一個特殊的類型never,它是所有類型的子類型,無法再進行細分,也就意味著除了其本身沒有類型可以再分配給它。

我們舉個例子來解釋下上述話語,如下所示:

  • 我們定義了一個變量amazing,給其賦予了never類型。
  • 我們分別給它賦了不同類型的值,全部編譯失敗,因為它無法再進行細分了。
let amazing: never;
amazing = 12;// 報錯:amazing是never類型不能分配給number類型
amazing = true;// 報錯:amazing是never類型不能分配給boolean類型
amazing = "真神奇";// 報錯:amazing是never類型不能分配給string類型
amazing = {};// 報錯:amazing是never類型不能分配給{}類型
amazing = [];// 報錯:amazing是never類型不能分配給[]類型

剔除聯合類型中的屬性

有一組聯合類型"a" | "b" | "c" | "d",我們想剔除屬性b和c,在TS中提供了一個名為Exclude的函數,它可以用來做這件事,接受兩個參數:

  • UnionType 聯合類型
  • ExcludedMembers 需要進行剔除的屬性

使用方法如下所示:

type P = Exclude<"a" | "b" | "c" | "d", "b" | "c"> // "a" | "d"

將對象中的所有屬性轉為聯合類型

有一個對象它包含2個可選屬性name、title,我們想把它轉為聯合類型name | title ,在TS中提供了一個名為keyof的函數,他可以用來處理這個問題,使用方法如下所示:

type A =  { [P in "name" | "title"]?: string };

type UnionType = keyof A; // "name" | "string"

實現互斥類型

有了前置知識作為鋪墊,接下來我們就可以將其利用起來,定義一個互斥類型出來,解決文章開頭所講述的問題。

接下來,我們來梳理下實現思路:

  • 實現一個排除類型,用于從A對象類型中剔除B對象類型中的屬性,并將排除后的屬性類型設為never,得到一個新對象類型。
  • 基于排除類型實現互斥類型,將A、B對象類型代入排除類型中,彼此將其排除,用或運算符將二者結果連接。

聰明的開發者可能已經猜到原理了,沒錯,就是部分屬性設為never。??

實現代碼

接下來,我們來看下代碼的實現,如下所示:

// 定義排除類型:將U從T中剔除, keyof 會取出T與U的所有鍵, 限定P的取值范圍為T中的所有鍵, 并將其類型設為never
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };

// 定義互斥類型,T或U只有一個能出現(互相剔除時,被剔除方必須存在)
type XOR<T, U> = (Without<T, U> & U) | (Without<U, T> & T);

注意:為了類型的可復用性,我們使用了泛型,對此不熟悉的開發者請移步:TypeScript中文網——泛型[1]

測試用例

我們將文章開頭所說的問題代入上述實現代碼中,看一下它能否將其解決??,如下所示:

// A類型
type A = {
name: string;
};

// B類型
type B = {
title: string;
};

// A和B兩種類型只有一個能出現
type AOrB = XOR<A, B>;

// 傳值測試
const AOrB1: AOrB = { name: "姓名" }; // 編譯通過
const AOrB2: AOrB = { title: "標題" }; // 編譯通過
const AOrB3: AOrB = { title: "標題", name: "姓名" }; // 報錯: Type '{ title: string; name: string; }' is not assignable to type 'AOrB'.
const AOrB4: AOrB = { name: "姓名", otherKey: "" }; // 報錯:Type '{ name: string; otherKey: string; }' is not assignable to type 'AOrB'.

當兩個屬性同時出現時,編輯器直接就拋出了類型錯誤(我們把排除后的所有屬性的類型設為了never,因此當你給其賦任何值時它都會報類型錯誤),如下圖所示:

用例拆解

有一部分開發者可能對上述測試用例比較懵,把它們拆開都認識,因為前置知識里都講了,但是寫到一起就不認識了??,沒關系,那我就把它們都拆解出來吧,代碼如下所示:

type AOB = ({ name?: never } & {
title: string;
}) | ({ title?: never } & {
name: string;
});

// 傳值測試
const a: AOB = { name: "姓名" }; // 編譯通過
const b: AOB = { title: "標題" }; // 編譯通過
const c: AOB = { title: "標題", name: "姓名" }; // 報錯
const d: AOB = { title: "標題", otherKey: "" }; // 報錯
責任編輯:武曉燕 來源: 神奇的程序員
相關推薦

2021-07-27 06:06:34

TypeScript語言運算符

2024-05-11 10:19:31

TypeScript類型接口

2022-08-08 09:00:42

TypeScript映射類型

2022-05-04 09:02:41

TypeScript類型工具

2021-06-09 07:55:19

Typescript類型檢查

2022-09-14 15:24:57

typescript快排

2022-04-10 19:26:07

TypeScript類型語法

2020-12-18 11:35:22

TypeScript語言Java

2022-02-25 09:06:02

TypeScripnever工具

2021-06-05 21:30:24

typescriptOverride檢查

2022-02-09 08:11:50

架構

2021-08-18 07:56:05

Typescript類型本質

2024-08-12 08:50:17

2011-01-14 13:50:37

2025-09-01 07:22:10

inferTypeScripfetch

2021-06-03 08:03:13

網絡

2022-09-20 14:43:55

TypeScript類型體操

2025-01-20 00:13:19

TypeScript操作符數據類型

2024-06-24 08:10:00

C++互斥鎖

2022-08-10 09:03:35

TypeScript前端
點贊
收藏

51CTO技術棧公眾號

国产精品区一区二区三区 | 成人亚洲激情网| 日本电影一区二区在线观看| 亚洲小说区图片区| 欧美丰满少妇xxxxx做受| av网站在线看| 亚洲国产日韩一区二区| 男女啪啪免费视频网站| 亚洲日本欧美| 国产精品h在线观看| 精品免费av在线| 7777精品伊人久久久大香线蕉经典版下载 | 欧美日韩电影在线观看| 午夜在线播放| 亚洲精品国产一区二区三区四区在线| 日韩在线视频在线| 国产精品第2页| 日本天堂影院在线视频| 国产高清精品二区| 中文字幕制服丝袜一区二区三区 | 激情文学综合插| 99一区二区三区| 伊人春色精品| 97国产成人精品视频| 99久久综合国产精品二区| 日韩精品一区二区三区老鸭窝| 亚洲成人精品一区二区三区| 亚洲美女一区二区三区| 宅男噜噜噜66国产免费观看| 99热精品一区二区| 欧美黄网在线观看| 国产91精品一区二区麻豆网站| 亚洲综合网中心| 久久狠狠婷婷| 日韩精品久久一区| 日本在线播放一区二区三区| 美女被啪啪一区二区| 免费看黄裸体一级大秀欧美| 久久国产精品久久精品国产| 一区在线视频观看| 久久久久久国产精品mv| 丝袜美腿亚洲色图| 亚洲第一综合网站| 国产精品一区二区在线播放| 五月天在线免费视频| 粉嫩av一区二区三区在线播放| 亚洲国产精品成人天堂| 91免费看视频| 久草在线在线视频| 亚洲国产日韩av| 成人影院免费观看| 337p日本欧洲亚洲大胆色噜噜| 污网站在线免费看| 亚洲香蕉av在线一区二区三区| 成人亚洲视频| 久久久噜噜噜久久中文字免| 免费看成人哺乳视频网站| 91精品视频网站| 欧美亚洲一区二区三区| 丰满女人性猛交| 久久久久国色av免费看影院| 免费特级黄毛片| 欧美最新大片在线看| 亚洲欧美成人影院| 色偷偷888欧美精品久久久| av不卡一区二区| 亚洲一区中文字幕在线观看| 另类亚洲自拍| 99爱视频在线| 精品免费在线观看| 午夜精品久久久久久久蜜桃app| 国产国产人免费人成免费视频| 亚洲尤物在线视频观看| y4480在线8影院| 欧美美女网站色| 日本另类视频| 国产精品444| 老司机午夜精品视频| 国产又大又硬又粗| 一本一道久久a久久精品| 免费av成人在线| 和岳每晚弄的高潮嗷嗷叫视频| 国产精品丝袜在线| 成人动漫在线免费观看| 亚洲人成电影网站色…| 亚洲制服一区| 色999五月色| 亚洲视频一区在线| 国精产品一区一区三区mba下载| 久久亚洲私人国产精品va| 999精品在线| 成人av在线播放观看| 一区二区在线观看免费| 色呦呦在线免费观看| 欧美激情视频在线观看| 国色天香一区二区| 精品www久久久久奶水| 欧美性色aⅴ视频一区日韩精品| 免费一级欧美在线观看视频| 国产成人精品av在线| 亚洲免费视频一区二区| 久久久久国产免费免费| 久久亚洲影院| 亚洲丰满在线| **欧美大码日韩| 丰满的护士2在线观看高清| 韩国美女主播一区| 麻豆精品一区二区综合av| 国产剧情演绎av| 亚洲精品综合久久中文字幕| 欧美日韩国产传媒| 亚洲精品欧洲精品| 亚洲动漫第一页| 99视频有精品高清视频| 精品不卡在线| 亚洲欧美日韩久久| 日韩av大片站长工具| 国产区一区二区三区| 日韩毛片精品高清免费| 欧美成人ⅴideosxxxxx| 国新精品乱码一区二区三区18| 成人av资源网站| www.色综合.com| 日日狠狠久久| 国产欧美日韩视频在线观看| 国产91精品青草社区| 亚洲视频精品在线观看| 日韩在线精品一区| 久久久人人人| 日本午夜在线视频| 97在线免费观看| av动漫一区二区| 成人影院在线视频| 久久大片网站| 欧洲一区二区三区在线| gogogo高清在线观看一区二区| 免费在线观看视频a| 亚洲国产精品国自产拍av秋霞| 午夜精品久久久久99热蜜桃导演 | av中文资源在线| 国产精品夫妻激情| 国产欧美日韩综合精品一区二区| 99色在线观看| 久久99精品久久久久久久久久| 亚洲国产精品天堂| 国产一区99| 国外av网站| 国产成人精品在线观看| 国产精品九色蝌蚪自拍| 亚洲日本一区二区三区在线| 一区二区在线观看网站| 欧美一区二区免费视频| 亚洲青涩在线| 久久日韩视频| 欧美亚洲免费高清在线观看 | 免费av在线网址| 999热视频在线观看| 五月婷婷久久综合| 色琪琪久久se色| 天堂√在线中文官网在线| 成人激情电影一区二区| 欧美色欧美亚洲高清在线视频| 婷婷亚洲图片| 大胆av不用播放器在线播放 | 国产精品二区三区四区| 色av一区二区| 在线综合亚洲| а√天堂官网中文在线| 杨幂一区欧美专区| 国产视频欧美视频| 成人免费毛片嘿嘿连载视频| 欧美成人黄色| 性欧美1819| 亚洲成国产人片在线观看| 久久91视频| 日本精品一区二区三区四区| 97视频在线观看视频免费视频 | 成人爱爱网址| 久久久久久久久久伊人| 亚洲电影一区二区| 中文字幕中文字幕中文字幕亚洲无线 | 伊人久久在线| www.天天射.com| 无套内精的网站| 欧美做暖暖视频| 九一免费在线观看| 黄色动漫在线免费看| 精品国产乱码久久久久久天美| 仙踪林久久久久久久999| 国产区av在线| 欧洲精品在线一区| 亚洲欧美综合图区| 成人国产一区二区三区精品| 国产成人在线观看| 在线综合亚洲| 国产成人精品网址| 日韩在线播放一区二区| 五月激情综合| 国产精品成人在线| 91精品国产综合久久精品性色|