跳至主要内容

Union(聯合型別) 與 Intersection(交叉型別)

Union(聯合型別):

定義與用法

Union(聯合型別) 用於表示一個變量可以是幾種不同型別中的一種。在 TypeScript 中,使用 | 符號來表示。

let value: string | number;
value = 'Hello'; // 合法
value = 42; // 合法
value = true; // 錯誤,型別不匹配

Union 的行為類似於布林邏輯中的 OR 操作,即變數可以是多種類型中的任意一種。

常見應用場景與例子

Union 常見的應用場景包括:

  1. 定義一個函數的參數可以接受多種不同型別,以處理不同 API 返回值的類型

    function formatValue(value: string | number): string {
    if (typeof value === 'string') {
    return value.toUpperCase();
    }
    return value.toFixed(2);
    }
  2. 當配置物件可以接受多種不同類型的值時,可以使用 Union來描述這些配置選項

    type ConfigOption = 'auto' | 'manual' | 'none';

    interface Config {
    mode: ConfigOption;
    }

    const config: Config = {
    mode: 'auto'
    };

Intersection(交集型別): &

定義與用法

Intersection(交叉型別) 用於表示一個變數必須同時滿足多個類型的條件。在 TypeScript 中,使用 & 符號來表示。

interface Person {
name: string;
}

interface Employee {
employeeId: number;
}

type EmployeePerson = Person & Employee;

const john: EmployeePerson = {
name: 'John',
employeeId: 123
};

Intersection 的行為類似於布林邏輯中的 AND 操作,即變數必須同時滿足多個類型的條件。

特別注意:Primitive 類型的 Intersection

當兩個都是原始類型(例如 stringnumber)進行 Intersection 操作時,結果會是 never 類型,表示沒有任何值能同時是這兩個原始類型。這一點需要特別注意,因為它會導致變數無法賦值任何值。

常見應用場景與例子

Intersection 常見的應用場景包括:

  1. 在函數中,當一個參數需要同時滿足多個條件時,可以使用 Intersection 來強制實現這一要求

    interface Serializable {
    serialize(): string;
    }

    interface Deserializable {
    deserialize(input: string): void;
    }

    type SerializableDeserializable = Serializable & Deserializable;

    function process(data: SerializableDeserializable) {
    const serialized = data.serialize();
    data.deserialize(serialized);
    }
  2. 增強現有的類型,新增更多屬性或方法

    interface BasicUser {
    name: string;
    }

    interface PremiumFeatures {
    premiumSupport: boolean;
    accessToBeta: boolean;
    }

    type PremiumUser = BasicUser & PremiumFeatures;

    const premiumUser: PremiumUser = {
    name: 'Bob',
    premiumSupport: true,
    accessToBeta: true
    };

Reference