[Medium] Interface vs Type Alias
1. What are Interface and Type Alias?
什麼是 Interface 和 Type Alias?
Interface(介面)
定義:用於定義物件的結構,描述物件應該有哪些屬性和方法。
interface User {
name: string;
age: number;
email?: string; // 可選屬性
}
const user: User = {
name: 'John',
age: 30,
};
Type Alias(型別別名)
定義:為型別建立一個別名,可以用於任何型別,不僅限於物件。
type User = {
name: string;
age: number;
email?: string;
};
const user: User = {
name: 'John',
age: 30,
};
2. Interface vs Type Alias: Key Differences
Interface 與 Type Alias 的主要差異
1. 擴展方式
Interface:使用 extends
interface Animal {
name: string;
}
interface Dog extends Animal {
breed: string;
}
const dog: Dog = {
name: 'Buddy',
breed: 'Golden Retriever',
};
Type Alias:使用交叉型別(Intersection)
type Animal = {
name: string;
};
type Dog = Animal & {
breed: string;
};
const dog: Dog = {
name: 'Buddy',
breed: 'Golden Retriever',
};
2. 合併(Declaration Merging)
Interface:支援合併
interface User {
name: string;
}
interface User {
age: number;
}
// 自動合併為 { name: string; age: number; }
const user: User = {
name: 'John',
age: 30,
};
Type Alias:不支援合併
type User = {
name: string;
};
type User = { // ❌ 錯誤:Duplicate identifier 'User'
age: number;
};
3. 適用範圍
Interface:主要用於物件結構
interface User {
name: string;
age: number;
}
Type Alias:可用於任何型別
// 基本型別
type ID = string | number;
// 函式型別
type Greet = (name: string) => string;
// 聯合型別
type Status = 'active' | 'inactive' | 'pending';
// 元組
type Point = [number, number];
// 物件
type User = {
name: string;
age: number;
};