type 和 interface 傻傻分不清楚?

大家好,我是若川。持續組織了8個月源碼共讀活動,感興趣的可以?點此加我微信ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。歷史面試系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信進群。


阿寶哥精心準備的《輕松學 TypeScript》?視頻教程已經更新到第十二期了,通過形象生動的動畫,讓你輕松搞懂 TypeScript 的難點和核心知識點!

如果你簡歷上的技能有寫 TypeScript,那么面試官可能會問你 type 和 interface 之間有什么區別?你知道怎么回答這個問題么?如果不知道的話,那看完本文也許你就懂了。

類型別名 type 可以用來給一個類型起個新名字,當命名基本類型或聯合類型等非對象類型時非常有用:

type?MyNumber?=?number;
type?StringOrNumber?=?string?|?number;
type?Text?=?string?|?string[];
type?Point?=?[number,?number];
type?Callback?=?(data:?string)?=>?void;

在 TypeScript 1.6 版本,類型別名開始支持泛型。我們工作中常用的 Partial、Required、Pick、Record 和 Exclude 等工具類型都是以 type 方式來定義的。

//?lib.es5.d.ts
type?Partial<T>?=?{[P?in?keyof?T]?:?T[P];
};type?Required<T>?=?{[P?in?keyof?T]-?:?T[P];
};type?Pick<T,?K?extends?keyof?T>?=?{[P?in?K]:?T[P];
};type?Record<K?extends?keyof?any,?T>?=?{[P?in?K]:?T;
};type?Exclude<T,?U>?=?T?extends?U???never?:?T;

而接口 interface 只能用于定義對象類型,Vue 3 中的 App 對象就是使用 interface 來定義的:

//?packages/runtime-core/src/apiCreateApp.ts
export?interface?App<HostElement?=?any>?{version:?stringconfig:?AppConfiguse(plugin:?Plugin,?...options:?any[]):?thismixin(mixin:?ComponentOptions):?thiscomponent(name:?string):?Component?|?undefined?//?Gettercomponent(name:?string,?component:?Component):?this?//?Setterdirective(name:?string):?Directive?|?undefineddirective(name:?string,?directive:?Directive):?this
}

由以上代碼可知,在定義接口時,我們可以同時聲明對象類型上的屬性和方法。了解 type 和 interface 的作用之后,我們先來介紹一下它們的相似之處。

1、類型別名和接口都可以用來描述對象或函數

類型別名

type?Point?=?{x:?number;y:?number;
};type?SetPoint?=?(x:?number,?y:?number)?=>?void;

在以上代碼中,我們通過 type 關鍵字為對象字面量類型和函數類型分別取了一個別名,從而方便在其他地方使用這些類型。

接口

interface?Point?{x:?number;y:?number;
}interface?SetPoint?{(x:?number,?y:?number):?void;
}

2、類型別名和接口都支持擴展

類型別名通過 &(交叉運算符)來擴展,而接口通過 extends 的方式來擴展。

類型別名擴展

type?Animal?=?{name:?string
}type?Bear?=?Animal?&?{?honey:?boolean?
}const?bear:?Bear?=?getBear()?
bear.name
bear.honey

接口擴展

interface?Animal?{name:?string
}interface?Bear?extends?Animal?{honey:?boolean
}

此外,接口也可以通過 extends 來擴展類型別名定義的類型:

type?Animal?=?{name:?string
}interface?Bear?extends?Animal?{honey:?boolean
}

同樣,類型別名也可以通過 &(交叉運算符)來擴展已定義的接口類型:

interface?Animal?{name:?string
}type?Bear?=?Animal?&?{?honey:?boolean?
}

了解完 type 和 interface 的相似之處之后,接下來我們來介紹它們之間的區別。

1、類型別名可以為基本類型、聯合類型或元組類型定義別名,而接口不行

type?MyNumber?=?number;
type?StringOrNumber?=?string?|?number;
type?Point?=?[number,?number];

2、同名接口會自動合并,而類型別名不會

同名接口合并

interface?User?{name:?string;
}interface?User?{id:?number;
}let?user:?User?=?{?id:?666,?name:?"阿寶哥"?};
user.id;?//?666
user.name;?//?"阿寶哥"

同名類型別名會沖突

type?User?=?{name:?string;
};//?標識符“User”重復。ts(2300)
type?User?=?{ //Errorid:?number;
};

利用同名接口自動合并的特性,在開發第三方庫的時候,我們就可以為使用者提供更好的安全保障。比如 webext-bridge 這個庫,使用 interface 定義了 ProtocolMap 接口,從而讓使用者可自由地擴展 ProtocolMap 接口。

之后,在利用該庫內部提供的 onMessage 函數監聽自定義消息時,我們就可以推斷出不同消息對應的消息體類型。

擴展 ProtocolMap 接口

import?{?ProtocolWithReturn?}?from?'webext-bridge'declare?module?'webext-bridge'?{export?interface?ProtocolMap?{foo:?{?title:?string?}bar:?ProtocolWithReturn<CustomDataType,?CustomReturnType>}
}

監聽自定義消息

import?{?onMessage?}?from?'webext-bridge'onMessage('foo',?({?data?})?=>?{//?type?of?`data`?will?be?`{?title:?string?}`console.log(data.title)
}

390ddf2e02ee659b0f8d268b70558d93.png

如果你感興趣的話,可以看一下該項目的源碼。若遇到問題,可以跟阿寶哥交流。最后我們來總結一下類型別名和接口的一些使用場景。

使用類型別名的場景:

  • 定義基本類型的別名時,使用 type

  • 定義元組類型時,使用 type

  • 定義函數類型時,使用 type

  • 定義聯合類型時,使用 type

  • 定義映射類型時,使用 type

使用接口的場景:

  • 需要利用接口自動合并特性的時候,使用 interface

  • 定義對象類型且無需使用 type 的時候,使用 interface

d0901952532b9381ca9f618bcc3b0c48.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經堅持寫了8年,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助4000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

4d3f8e671d34af66a4d64129c64adf2b.png

掃碼加我微信 ruochuan02、拉你進源碼共讀

今日話題

目前建有江西|湖南|湖北?籍 前端群,想進群的可以加我微信 ruochuan12?進群。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274675.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

上帝公式_感謝上帝的空白

上帝公式Do you ever walk into a room cluttered with discarded papers and leftover takeout and feel comfortable?您是否曾經走進過亂七八糟的房間&#xff1f; Yes, you might if you’re a sophomore at college. That’s just dorm life. Back in the late 90’s to …

POJ 1325 Machine Schedule(二分圖最小點集覆蓋)

題目鏈接&#xff1a;http://poj.org/problem?id1325 題意&#xff1a;A機器有n個模式&#xff0c;B機器有m個模式&#xff0c;有k個任務&#xff0c;第i個任務可以用A機器的ai模式或者B機器的bi模式&#xff0c;換模式需要重啟&#xff0c;開始兩個機器都在模式0&#xff0c;…

figma下載_在Figma上進行原型制作的各種觸發選項

figma下載Prototypes are model versions of digital products. They’re used to measure usability by testing with potential users of a product. When making prototypes with Figma, it is necessary that the actions that trigger reactions aren’t strangers and th…

通過動畫讓你深入理解 ES modules

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以 點此加我微信ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

海量數據處理之倒排索引

前言&#xff1a;本文是對博文http://blog.csdn.net/v_july_v/article/details/7085669的總結和引用 一&#xff0c;什么是倒排索引 問題描述&#xff1a;文檔檢索系統&#xff0c;查詢那些文件包含了某單詞&#xff0c;比如常見的學術論文的關鍵字搜索。 基本原理及要點&#…

ux和ui_如何為您的UX / UI設計選擇正確的原型制作工具

ux和uiAll UX/UI designers might encounter the situation of creating prototypes for wireframes or visual designs. In some cases, you may also receive the need to craft motion designs, for instance, animating icons or illustrations.所有UX / UI設計人員都可能遇…

Vue 性能指標逐漸開始反超 React 了!

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以 點此加我微信ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

制作Ubuntu U 盤啟動盤在ubuntu12.04中

制作U盤啟動盤&#xff0c;這樣就可以通過U盤來裝系統了&#xff0c;簡單便攜。 在Ubuntu下&#xff0c;從dash home中找到Startup disk creator&#xff0c;當然之前把U盤插好&#xff0c;然后很簡單的兩個選擇就好了。 轉載于:https://www.cnblogs.com/allenzhaox/archive/20…

figma下載_我如何使用Figma,CSS Grid和CSS Flexbox構建登錄頁面

figma下載I enjoy looking at website designs that are on platforms like Behance, Dribble, etc. as they are visually very pleasing to the eye. While scrolling through these designs, I always wonder about one thing, that is, how difficult would it be to expre…

2022年Web平臺的新動態

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以 點此加我微信ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

【原創】ABAP動態編程之功能實現

根據名字獲取結構 DATA: STRUCTTYPE TYPE REF TO CL_ABAP_STRUCTDESCR. STRUCTTYPE ? CL_ABAP_TYPEDESCR>DESCRIBE_BY_NAME( SPFLI ). 根據變量獲取結構 DATA: DATATYPE TYPE REF TO CL_ABAP_ELEMDESCR,W_CHAR TYPE CHAR5. DATATYPE ? CL_ABAP_TYPEDESCR>DESCRIBE_BY_D…

【逃離一線】被裁后的面經與感慨

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以 點此加我微信ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

document.body.scrollTop以及一些備忘

網頁可見區域寬&#xff1a;document.body.clientWidth; 網頁可見區域高&#xff1a; document.body.clientHeight; 網頁可見區域寬&#xff1a; document.body.offsetWidth (包括邊線的寬); 網頁可見區域高&#xff1a; document.body.offsetHeight (包括邊線的寬); 網頁正文全…

使命召喚ios_使命召喚的精巧UI:戰地

使命召喚iosWith over 50 million players worldwide it’s safe to say Warzone has become a global sensation. Featuring cross-platform play, multiple game modes, customisation and wealth of features too long to mention here — it’s captured its audience and …

深入淺出 package.json,目測大多數人不了解它

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以 點此加我微信ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

圖片旋轉代碼

http://code.google.com/p/jqueryrotate/wiki/Examples轉載于:https://www.cnblogs.com/booth/archive/2012/08/16/2642163.html

鯨魚網絡連接_登陸鯨魚:在網絡上讀書,第1部分

鯨魚網絡連接I don’t know when it was I started using the text of Moby Dick in my workshops and talks. Likely it dates back to some of my earliest explorations of web typography. Since it’s out of copyright, it’s one those texts you can find online in va…

2022年值得使用的 Node.js 框架

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以 點此加我微信ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

更改apk安裝包對android系統等級要求

此篇文章解決的為問題: █問題1.系統等級與apk等級不匹配. █問題2.更改api等級后的簽名問題. 1.工具準備: 解壓縮tool.zip文件夾: 2.開始反編譯apk安裝包 3.切換目錄到tool目錄下: 4.反編譯: apktool.bat d 待編譯apk目錄名 存放編譯后的文件目錄 apktool.bat d Onenote_v14.…

推薦一個前端技術選型神器!真好用~

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以 點此加我微信ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…