typescript中type和interface的區(qū)別有哪些
前言
在typescript里面,有兩個(gè)概念十分容易混淆,那便是 type 和 interface,它倆都可以用來表示 接口,但是實(shí)際使用上會(huì)存在一些差異,因此本篇文章就準(zhǔn)備聊聊它倆,徹底弄清它倆的聯(lián)系與區(qū)別,廢話不多說,開搞!
type和interface的相同點(diǎn)
在我看來,它倆就是對(duì) 接口定義 的兩種不同形式,目的都是一樣的,都是用來定義 對(duì)象 或者 函數(shù) 的形狀,示例如下
interface example { name: string age: number } interface exampleFunc { (name:string,age:number): void } type example = { name: string age: number } type example = (name:string,age:number) => void
它倆也支持 繼承,并且不是獨(dú)立的,而是可以 互相 繼承,只是具體的形式稍有差別
type exampleType1 = { name: string } interface exampleInterface1 { name: string } type exampleType2 = exampleType1 & { age: number } type exampleType2 = exampleInterface1 & { age: number } interface exampleInterface2 extends exampleType1 { age: number } interface exampleInterface2 extends exampleInterface1 { age: number }
可以看到對(duì)于interface來說,繼承是通過 extends 實(shí)現(xiàn)的,而type的話是通過 & 來實(shí)現(xiàn)的,也可以叫做 交叉類型
type和interface的不同點(diǎn)
首先聊聊type可以做到,但interface不能做到的事情
- type可以定義 基本類型的別名,如
type myString = string
- type可以通過 typeof 操作符來定義,如
type myType = typeof someObj
- type可以申明 聯(lián)合類型,如
type unionType = myType1 | myType2
- type可以申明 元組類型,如
type yuanzu = [myType1, myType2]
接下來聊聊interface可以做到,但是type不可以做到的事情
interface可以 聲明合并,示例如下
interface test { name: string } interface test { age: number } /* test實(shí)際為 { name: string age: number } */
這種情況下,如果是type的話,就會(huì)是 覆蓋 的效果,始終只有最后一個(gè)type生效
結(jié)語
其實(shí)在typescript里,還有很多容易搞混淆的概念,如 extends 和 implements 等,還有一些高級(jí)概念,如 泛型。這些都是在ts里必知必會(huì)的東西,因此一定要細(xì)摳這些知識(shí)點(diǎn)
ts給我們的代碼帶來健壯性的同時(shí),也引入了更多的概念和知識(shí),因此需要我們不斷地學(xué)習(xí)。在今后我也準(zhǔn)備多輸出一些關(guān)于ts的文章,加深自己對(duì)于ts的理解,同時(shí)也可以幫助到喜歡看我文章的朋友,好啦,就寫到這里啦,over!
如何選擇 Interface 、 Type
雖然 官方 中說幾乎接口的所有特性都可以通過類型別名來實(shí)現(xiàn),但建議優(yōu)先選擇接口,接口滿足不了再使用類型別名,在 typescript 官網(wǎng) Preferring Interfaces Over Interps 有說明,具體內(nèi)容如下:
大多數(shù)時(shí)候,對(duì)象類型的簡單類型別名的作用與接口非常相似
interface Foo { prop: string } type Bar = { prop: string };
但是,一旦你需要組合兩個(gè)或多個(gè)類型來實(shí)現(xiàn)其他類型時(shí),你就可以選擇使用接口擴(kuò)展這些類型,或者使用類型別名將它們交叉在一個(gè)中(交叉類型),這就是差異開始的時(shí)候。
- 接口創(chuàng)建一個(gè)單一的平面對(duì)象類型來檢測(cè)屬性沖突,這通常很重要! 而交叉類型只是遞歸的進(jìn)行屬性合并,在某種情況下可能產(chǎn)生 never 類型
- 接口也始終顯示得更好,而交叉類型做為其他交叉類型的一部分時(shí),直觀上表現(xiàn)不出來,還是會(huì)認(rèn)為是不同基本類型的組合。
- 接口之間的類型關(guān)系會(huì)被緩存,而交叉類型會(huì)被看成組合起來的一個(gè)整體。
- 最后一個(gè)值得注意的區(qū)別是,在檢查到目標(biāo)類型之前會(huì)先檢查每一個(gè)組分。
出于這個(gè)原因,建議使用接口/擴(kuò)展擴(kuò)展類型而不是創(chuàng)建交叉類型。
- type Foo = Bar & Baz & { - someProp: string; - } + interface Foo extends Bar, Baz { + someProp: string; + }
簡單的說,接口更加符合 JavaScript 對(duì)象的工作方式,簡單的說明下,當(dāng)出現(xiàn)屬性沖突時(shí):
// 接口擴(kuò)展 interface Sister { sex: number; } interface SisterAn extends Sister { sex: string; } // index.ts(5,11): error TS2430: Interface 'SisterAn' incorrectly extends interface 'Sister'. // Types of property 'sex' are incompatible. // Type 'string' is not assignable to type 'number'.
// 交叉類型 type Sister1 = { sex: number; } type Sister2 = { sex: string; } type SisterAn = Sister1 & Sister2; // 不報(bào)錯(cuò),此時(shí)的 SisterAn 是一個(gè)'number & string'類型,也就是 never
總結(jié)
到此這篇關(guān)于typescript中type和interface區(qū)別的文章就介紹到這了,更多相關(guān)typescript type和interface區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Typescript 中的 interface 和 type 到底有什么區(qū)別詳解
- 詳解TypeScript中type與interface的區(qū)別
- typeScript?核心基礎(chǔ)之接口interface
- TypeScript中正確使用interface和type的方法實(shí)例
- Typescript中interface自動(dòng)化生成API文檔詳解
- TypeScript定義接口(interface)案例教程
- TypeScript中type和interface的區(qū)別及注意事項(xiàng)
- Typescript中 type 與 interface 的區(qū)別說明總結(jié)
相關(guān)文章
利用Print.js實(shí)現(xiàn)打印pdf、HTML及圖片(可設(shè)置樣式可分頁)
在我們需要在頁面中打印某個(gè)區(qū)域的內(nèi)容或者生成pdf的時(shí)候,我們可以直接用printJs庫,這篇文章主要給大家介紹了關(guān)于利用Print.js實(shí)現(xiàn)打印pdf、HTML及圖片的相關(guān)資料,可設(shè)置樣式可分頁,需要的朋友可以參考下2024-05-05javascript循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法
這是一道比較經(jīng)典的循環(huán)鏈表問題,在華為上機(jī)筆試中也出現(xiàn)過。 約瑟夫環(huán)是一個(gè)數(shù)學(xué)的應(yīng)用問題,下面這篇文章主要就給大家介紹了javascript循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01解決layui數(shù)據(jù)表格table的橫向滾動(dòng)條顯示問題
今天小編就為大家分享一篇解決layui數(shù)據(jù)表格table的橫向滾動(dòng)條顯示問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS實(shí)現(xiàn)關(guān)鍵詞高亮顯示正則匹配
這篇文章主要介紹了JS實(shí)現(xiàn)關(guān)鍵詞高亮顯示正則匹配功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06javascript 刪除數(shù)組中重復(fù)項(xiàng)(uniq)
巧妙去除數(shù)組中的重復(fù)項(xiàng)的方法參考,需要的朋友可以參考下。2010-01-01關(guān)于Javascript 的 prototype問題。
關(guān)于Javascript 的 prototype問題。...2007-01-01