您好,登錄后才能下訂單哦!
這篇文章主要介紹“TypeScript中interface和type間的區(qū)別是什么”,在日常操作中,相信很多人在TypeScript中interface和type間的區(qū)別是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”TypeScript中interface和type間的區(qū)別是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
interface和type的區(qū)別是什么?本篇文章就來(lái)對(duì)比一下TypeScript中interface和type,帶大家了解一下interface和type間的差異,介紹一下在實(shí)際使用中選哪個(gè)!
當(dāng)我們使用 TypeScript 時(shí),就會(huì)用到 interface
和 type
,平時(shí)感覺(jué)他們用法好像是一樣的,沒(méi)啥區(qū)別,都能很好的使用,所以也很少去真正的理解它們之間到底有啥區(qū)別。我們開(kāi)發(fā)過(guò)經(jīng)?;蜻@么來(lái)定義類型:
interface Point { x: number; y: number; }
或者這樣定義:
type Point = { x: number; y: number; };
interface
和 type
之間的差異不僅僅是次要語(yǔ)法聲明。那么,今天我們就來(lái)看看這兩家伙之間存在啥不可告人的秘密。
TypeScript 有 boolean
、number
、string
等基本類型。如果我們想聲明高級(jí)類型,我們就需要使用類型別名。
類型別名指的是為類型創(chuàng)建新名稱。需要注意的是,我們并沒(méi)有定義一個(gè)新類型。使用type
關(guān)鍵字可能會(huì)讓我們覺(jué)得是創(chuàng)建一個(gè)新類型,但我們只是給一個(gè)類型一個(gè)新名稱。
所以我們所以 type 時(shí),不是在創(chuàng)建新的類別,而是定義類型的一個(gè)別名而已。
與 type
相反,接口僅限于對(duì)象類型。它們是描述對(duì)象及其屬性的一種方式。類型別名聲明可用于任何基元類型、聯(lián)合或交集。在這方面,接口被限制為對(duì)象類型。
在討論它們的區(qū)別之前,我們先來(lái)看看它們的相似之處。
interface 和 type 都可以繼承。另一個(gè)值得注意的是,接口和類型別名并不互斥。類型別名可以繼承接口,反之亦然。
對(duì)于一個(gè)接口,繼承另一個(gè)接口
interface PartialPointX { x: number; } interface Point extends PartialPointX { y: number; }
或者,繼承一個(gè)類型
type PartialPointX = { x: number; }; interface Point extends PartialPointX { y: number; }
類型繼承另一個(gè)類型:
type PartialPointX = { x: number; }; type Point = PartialPointX & { y: number; };
或者,繼承一個(gè)接口:
interface PartialPointX { x: number; } type Point = PartialPointX & { y: number; };
類可以實(shí)現(xiàn)接口以及類型(TS 2.7+)。但是,類不能實(shí)現(xiàn)聯(lián)合類型。
interface Point { x: number; y: number; } class SomePoint implements Point { x = 1; y = 2; } type AnotherPoint = { x: number; y: number; }; class SomePoint2 implements AnotherPoint { x = 1; y = 2; } type PartialPoint = { x: number; } | { y: number; }; // Following will throw an error class SomePartialPoint implements PartialPoint { x = 1; y = 2; }
雖然接口可以被擴(kuò)展和合并,但它們不能以聯(lián)合和交集的形式組合在一起。類型可以使用聯(lián)合和交集操作符來(lái)形成新的類型。
// object type PartialPointX = { x: number; }; type PartialPointY = { y: number; }; // 并集 type PartialPoint = PartialPointX | PartialPointY; // 交集 type PartialPoint = PartialPointX & PartialPointY;
TypeScript編譯器合并兩個(gè)或多個(gè)具有相同名稱的接口。 這不適用于類型。 如果我們嘗試創(chuàng)建具有相同名稱但不同的屬性的兩種類型,則TypeScript編譯器將拋出錯(cuò)誤。
// These two declarations become: // interface Point { x: number; y: number; } interface Point { x: number; } interface Point { y: number; } const point: Point = { x: 1, y: 2 };
元組(鍵值對(duì))只能通過(guò)type
關(guān)鍵字進(jìn)行定義。
type Point = [x: number, y: number];
沒(méi)有辦法使用接口聲明元組。不過(guò),我們可以在接口內(nèi)部使用元組
interface Point { coordinates: [number, number] }
一般來(lái)說(shuō),接口和類型都非常相似。
對(duì)于庫(kù)或第三方類型定義中的公共API定義,應(yīng)使用接口來(lái)提供聲明合并功能。除此之外,我們喜歡用哪個(gè)就用哪個(gè),但是在整個(gè)代碼庫(kù)中應(yīng)該要保持一致性。
到此,關(guān)于“TypeScript中interface和type間的區(qū)別是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。