在 TypeScript 中,interface
和 type
都用來(lái)定義自定義類(lèi)型。它們有一些相似之處,但也有一些區(qū)別。
interface
使用 interface
關(guān)鍵字來(lái)定義,而 type
使用 type
關(guān)鍵字來(lái)定義。// interface 的定義方式
interface Person {
name: string;
age: number;
}
// type 的定義方式
type Person = {
name: string;
age: number;
}
interface
名稱時(shí),會(huì)自動(dòng)合并聲明,而對(duì)于 type
則會(huì)報(bào)錯(cuò)。// interface 的合并聲明
interface Person {
name: string;
}
interface Person {
age: number;
}
// type 的合并聲明會(huì)報(bào)錯(cuò)
type Person = {
name: string;
}
type Person = {
age: number;
}
interface
可以被類(lèi)實(shí)現(xiàn),也可以被其他接口繼承,而 type
不具備這些能力。// interface 的實(shí)現(xiàn)和繼承
interface Animal {
name: string;
eat(): void;
}
class Dog implements Animal {
name: string;
eat(): void {
console.log('Dog is eating.');
}
}
// interface 的繼承
interface Person {
name: string;
age: number;
}
interface Employee extends Person {
position: string;
}
// type 不能實(shí)現(xiàn)和繼承
interface
可以通過(guò)交叉類(lèi)型表示多個(gè)類(lèi)型的組合,而 type
不能。// interface 的交叉類(lèi)型
interface A {
name: string;
}
interface B {
age: number;
}
type AB = A & B;
// type 不支持交叉類(lèi)型
綜上所述,interface
適用于定義對(duì)象的結(jié)構(gòu),可以被類(lèi)實(shí)現(xiàn)和其他接口繼承,可以定義交叉類(lèi)型;而 type
則提供了更強(qiáng)大的類(lèi)型操作能力,比如聯(lián)合類(lèi)型、交叉類(lèi)型、類(lèi)型別名,但不支持類(lèi)實(shí)現(xiàn)和接口繼承。在大多數(shù)情況下,可以根據(jù)具體需求選擇使用 interface
還是 type
。