91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

TypeScript的交叉類型和聯合類型是什么

發布時間:2023-01-03 10:37:07 來源:億速云 閱讀:156 作者:iii 欄目:開發技術

這篇文章主要介紹了TypeScript的交叉類型和聯合類型是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇TypeScript的交叉類型和聯合類型是什么文章都會有所收獲,下面我們一起來看看吧。

    交叉類型(Intersection types)

    什么事交叉類型呢?簡單來說就是通過&符號將多個類型進行合并成一個類型,然后用type來聲明新生成的類型。這里我舉個例子,具體如下:

    interface ClassA{
        name:string;
        age:number
    }
    interface ClassB{
        name:string;
        phone:number;
    }

    將接口ClassA和接口ClassB通過&進行合并創建一個新的接口類型Class

    type Class = ClassA & ClassB
    let info:Class = {
        name:'zhagsan',
        age:18,
        phone:1573875555
    }

    要點

    任何類型都能通過&合并成新的類型嗎?

    • 這肯定是不行的,原子類型進行合并是沒有任何意義,因為它們合并后的類型是never,比如string&number,這肯定是錯誤的,因為不可能有既滿足字符串又滿足數字類型。

    合并的接口類型中具有同名屬性,該怎么處理?

    • 這里分兩種情況,如果同名屬性的類型相同則合并后還是原本類型,如果類型不同,則合并后類型為never

    interface X{
    	q:number,
    	w:string
    }
    interface Y{
    	q:boolean,
    	r:string,
    }
    type XY = X&Y

    編輯器中直接就給我們了提示,如下圖所示:

    TypeScript的交叉類型和聯合類型是什么

    再舉一個稍微復雜點的例子

    interface A {
        inner: D;
    }
    interface B {
        inner: E;
    }
    interface C {
        inner: F;
    }
    
    interface D {
        d: boolean;
    }
    interface E {
        e: string;
    }
    interface F {
        f: number;
    }
    type ABC = A & B & C;
    let abc: ABC = {
        inner: {
            d: false,
            e: 'className',
            f: 5
        }
    };

    聯合類型(Union types)

    聯合類型和交叉類型比較相似,聯合類型通過|符號連接多個類型從而生成新的類型。它主要是取多個類型的交集,即多個類型共有的類型才是聯合類型最終的類型。聯合類型可以是多個類型其中一個,可做選擇,比如:string | number,它的取值可以是string類型也可以是number類型。
    舉幾個例子,如下所示:

    • 聲明變量的時候設置變量類型

    let a:string|number|boolean;
    a = 's';
    a = 1;
    a= false;
    • 多個接口類型進行聯合

    interface X{
    	q:number,
    	w:string,
    	r:string
    }
    interface Y{
    	q:number
    	r:string,
    }
    type XY = X | Y
    let value:XY = {
        q:1,
        r:'r'
    }
    • 函數接口類型進行聯合

    interface X{
    	x:()=>string;
    	y:()=>Number;
    }
    interface Y{
    	x:()=>string;
    }
    type XY = X|Y;
    function func1():XY{
    //此處不進行類型斷言為XY在編輯器中會報類型錯誤
      return {} as XY
    
    }
    let testFunc = func1();
    testFunc.x();
    testFunc.y(); //Error:類型“XY”上不存在屬性“y”,類型“Y”上不存在屬性“y”。

    另外我們還要注意,testFunc.x()還會報類型錯誤,我們需要用類型守衛來區分不同類型。這里我們用in操作符來判斷

    if('x' in testFunc) testFunc.x()

    類型縮減

    • 當字面量類型和原始類型進行聯合,那么就會造成類型縮減。

    type A = 'a' | string;  //string類型
    type B = false | boolean; //bolean 類型
    type C = 1 | number; //number類型
    • 當然枚舉也會有類型縮減現象,如下:

    enum Class{
       A,
       B
     }
    type C = Class.A | Class;//Class類型

    我們發現:TS會把字面量類型和枚舉成員類型給縮減掉,只剩下原始類型和枚舉類型
    思考一個問題:當接口類型進行聯合,接口中同名屬性的類型不同,該怎么進行縮減呢?比如下面的例子,看到這里的話,如果你知道答案寫在評論區。

    interface A{
       name:string
    }
    interface B{
       name:string | number
       [property:string]:any
    }
    type AB = A|B

    關于“TypeScript的交叉類型和聯合類型是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“TypeScript的交叉類型和聯合類型是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    宝山区| 鲁甸县| 永春县| 新昌县| 泾川县| 河东区| 渭源县| 密云县| 奉节县| 定远县| 融水| 大冶市| 丰镇市| 新巴尔虎右旗| 徐汇区| 花莲市| 淄博市| 镇坪县| 长葛市| 措勤县| 偏关县| 泽库县| 辽阳县| 松溪县| 鹤峰县| 綦江县| 永胜县| 莎车县| 绥化市| 文登市| 龙南县| 黎平县| 聂荣县| 子洲县| 通城县| 安溪县| 中宁县| 丹江口市| 方正县| 阿图什市| 嘉善县|