Type 和 Interface的差別
在 TypeScript 中,Type 和 Interface 都可以用來描述類型。Type 是一種可以命名的類型,而 Interface 是一種描述對象結構的方式。
Type 可以聲明任何類型,例如基本類型、聯合類型、元組、函數類型等。Type 也可以組合其他類型,創建複雜的自定義類型。
Interface 則主要用於描述對象的形狀,可以描述對象的屬性、方法、可選屬性等。Interface 可以繼承其他 Interface,方便模塊化的定義。
總體而言,Type 更適合用於命名複雜的類型或聯合類型,Interface 則更適合用於描述對象的結構。不過在實際使用中,兩者有些功能是可以互換的,選擇哪種方式取決於個人和項目的需求。
深入理解 TypeScript 的 type 以及 type 与 interface 和 class 的区别_typescript_Lee Chen_InfoQ写作社区
詳細比較表
| 功能 | type | interface |
|---|---|---|
| 描述物件形狀 | ✅ | ✅ |
| 聯合型別 (Union) | ✅ type A = B | C | ❌ |
| 交叉型別 (Intersection) | ✅ type A = B & C | ✅ extends |
| 元組 (Tuple) | ✅ | ❌ |
| 擴展 (Extend) | & 交叉 | extends 繼承 |
| 宣告合併 (Declaration Merging) | ❌ | ✅ |
| 映射型別 (Mapped Types) | ✅ | ❌ |
| 基本型別別名 | ✅ type ID = string | ❌ |
程式碼範例
// Type: 聯合型別
type Status = 'active' | 'inactive' | 'pending';
type ID = string | number;
// Interface: 宣告合併(自動合併同名 interface)
interface User { name: string; }
interface User { age: number; }
// 等同於 interface User { name: string; age: number; }
// Type: 交叉型別
type Admin = User & { role: string };
// Interface: 繼承
interface Admin2 extends User { role: string; }
選擇建議
- 定義物件結構 → 用
interface(支援宣告合併,對函式庫更友善) - 聯合型別、元組、複雜型別 → 用
type - 統一風格 → 團隊選一種為主即可,兩者大部分場景可互換