需求示例:
一個(gè)HTTP請(qǐng)求參數(shù)類型,用于創(chuàng)建會(huì)議。
會(huì)議可以為音頻、或者視頻,所以參數(shù)類型要么為音頻會(huì)議的類型、要么為視頻會(huì)議的類型,剩下的是兩種會(huì)議共有的參數(shù)。
開始的想法:
interface VideoConferenceRoom {
mode: "VIDEO";
layout: 1 | 2 | 3 | 4 | 6 | 9;
bitrate: number;
framerate: number;
resolution: "CIF" | "QCIF" | "VGA" | "SVGA" | "XVGA" | "HD720" | "QVGA";
}
interface AudioConferenceRoom {
mode: "AUDIO";
}
interface CreateConferenceRoomParams
extends VideoConferenceRoom,
AudioConferenceRoom {
extension_number: string;
room_pin: string;
admin_pin: string;
subject: string;
language: string;
custom_options: string;
outbound_caller_ids: { provider_id: string; caller_id: string }[];
}
error: Interface 'CreateConferenceRoomParams' cannot simultaneously extend types 'VideoConferenceRoom' and 'AudioConferenceRoom'.
Named property 'mode' of types 'VideoConferenceRoom' and 'AudioConferenceRoom' are not identical.
失敗,因?yàn)?code>interface的多重繼承需要被繼承的接口完全一致,而此處的兩個(gè)接口的mode字段并不兼容。
那么我們需要一個(gè)Unit types的中間類型:
......省略......
// 新增
type ConferenceRoom = AudioConferenceRoom | VideoConferenceRoom;
interface CreateConferenceRoomParams
extends ConferenceRoom {
extension_number: string;
room_pin: string;
admin_pin: string;
subject: string;
language: string;
custom_options: string;
outbound_caller_ids: { provider_id: string; caller_id: string }[];
}
error: An interface can only extend an object type or intersection of object types with statically known members.
失敗,接口只能繼承一個(gè)靜態(tài)類型,而聯(lián)合類型是不確定的。那么最后的:
interface VideoConference {
mode: "VIDEO";
layout: 1 | 2 | 3 | 4 | 6 | 9;
bitrate: number;
framerate: number;
resolution: "CIF" | "QCIF" | "VGA" | "SVGA" | "XVGA" | "HD720" | "QVGA";
}
interface AudioConference {
mode: "AUDIO";
}
type ConferenceMedia = VideoConference | AudioConference;
export type CreateConferenceRoomParams = ConferenceMedia & {
extension_number: string;
room_pin: string;
admin_pin: string;
subject: string;
language: string;
custom_options: string;
outbound_caller_ids: { provider_id: string; caller_id: string }[];
};
使用類型別名來(lái)實(shí)現(xiàn),將兩個(gè)類型交叉后,得到一個(gè)符合需求的類型組合。
順便類型名稱改了一下,變得更符合語(yǔ)義