面試官:Typescript中的Iinterface與Type的區(qū)別?
作者:dev
兩者在描述對象時(shí)有很多相似之處,但 ??interface?? 更偏向于面向?qū)ο蟮脑O(shè)計(jì)和擴(kuò)展,而 ??type?? 則在類型組合和別名方面更靈活。選擇哪一個(gè)主要取決于你的具體需求和團(tuán)隊(duì)的編碼風(fēng)格。
在 TypeScript 中,interface 與 type 都可以用來描述對象的形狀,但它們之間存在一些關(guān)鍵區(qū)別:
聲明合并(Declaration Merging)
- interface:支持聲明合并。你可以在多個(gè)地方聲明同一個(gè)接口,TypeScript 會將它們合并成一個(gè)接口。例如:
interface Person {
name: string;
}
interface Person {
age: number;
}
// Person 合并后等同于 { name: string; age: number; }
- type:不支持聲明合并。重復(fù)聲明同一個(gè)類型別名會報(bào)錯(cuò)。
表達(dá)能力
- interface:主要用于描述對象的結(jié)構(gòu)(屬性、方法等),適合面向?qū)ο蟮脑O(shè)計(jì)模式。
- type:不僅可以描述對象,還可以定義聯(lián)合類型、交叉類型、原始類型別名、元組等。例如:
type ID = number | string;
type Coordinates = [number, number];
擴(kuò)展方式
- interface:可以通過 extends 關(guān)鍵字繼承其他接口,支持接口的擴(kuò)展和實(shí)現(xiàn)。
interface Animal {
name: string;
}
interface Dog extends Animal {
breed: string;
}
- type:雖然不能直接使用 extends,但可以通過交叉類型實(shí)現(xiàn)類似擴(kuò)展的效果:
type Animal = { name: string };
type Dog = Animal & { breed: string };
用途和選擇
- 如果主要用于定義對象的結(jié)構(gòu),并希望利用聲明合并或面向?qū)ο蟮奶匦?,建議使用 interface。
- 如果需要更強(qiáng)的表達(dá)能力,比如定義聯(lián)合類型、元組等,或者希望用一種統(tǒng)一的方式描述多種類型,則可以選擇 type。
總結(jié)來說,兩者在描述對象時(shí)有很多相似之處,但 interface
更偏向于面向?qū)ο蟮脑O(shè)計(jì)和擴(kuò)展,而 type
則在類型組合和別名方面更靈活。選擇哪一個(gè)主要取決于你的具體需求和團(tuán)隊(duì)的編碼風(fēng)格。
責(zé)任編輯:姜華
來源:
大遷世界