Interface 和 Type 的差別
2024年10月14日•2 分鐘閱讀
Interface 和 Type 的差別
1.TypeScript 編譯器推論結果不同
Type
宣告 Type
時,所使用的名稱代表的是其背後的型別結構
1type Person = {2 name: string;3 age: number;4 gender: string;5};6type Employee = Person;78/**9 * TypeScript 編譯器推論結果為:10 * type Employee =11 * {12 * name: string;13 * age: number;14 * gender: string;15 * }16 **/
Interface
Interface 介面宣告時會使用名稱代表 TypeScript 編譯器推論的結果
1interface Person {2 name: string;3 age: number;4 gender: string;5}6type Employee = Person; // TypeScript 編譯器推論結果為: type Employee = Person
2.Type 和 Interface 的擴展性差異
Type
Type 較適合靜態、變動性較小的資料結構,並且可以表達任一型別。
1type Phone = {2 brand: string;3 model: string;4 price: number;5};
雖然 Type 無法擴充,但可以使用交集運算子 &
來合併多個 Type。
然而,與 Interface 不同的是,Type 不能進行重新開放(declaration merging),這意味著無法多次聲明一個 Type 來合併屬性。
1type Person = {2 name: string;3};45type Employee = Person & {6 salary: number;7};
另外,Type 不僅限於物件也可以用於其他型別的別名,像是聯合型別、函數型別、原始型別等。
1// 原始型別別名23type StringAlias = string;45// 聯合型別6type UnionType = string | number;78// 函數型別9type FunctionType = (a: number, b: number) => number;
Interface
Interface 的宣告較為靈活,可以用來描述物件、函式、類別、JSON物件等...,並且可以自由的進行擴充。
1interface Person {2 name: string;3}45interface Person {6 age: number;7}89// 合併後的 Person 會包含 name 和 age 屬性10const person: Person = {11 name: "John",12 age: 30,13};
Interface 支持宣告合併(declaration merging),這表示可以多次宣告同一個 Interface,並且 TypeScript 會將它們合併。
1interface Phone {2 brand: string;3 model: string;4 price: number;5}67interface SmartPhone extends Phone {8 os: string;9}
標籤:
2024iT鐵人賽Typescriptinterfacetype