TS中interface和type的區(qū)別

小云
225
2023-09-22 02:16:39

在 TypeScript 中,interfacetype 都用來(lái)定義自定義類(lèi)型。它們有一些相似之處,但也有一些區(qū)別。

  1. 定義方式: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;
}
  1. 合并聲明:當(dāng)多次定義同一個(gè) 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;
}
  1. 可以實(shí)現(xiàn)和繼承的能力: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)和繼承
  1. 可以使用交叉類(lèi)型: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

0