偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

TypeScript 中 Interface 與 Type 的區(qū)別?該用哪個(gè)比較好?

開(kāi)發(fā) 前端
類型別名的右邊可以是任何類型,包括基本類型、元祖、類型表達(dá)式( & 或 | 等);而在接口聲明中,右邊必須為變量結(jié)構(gòu)。

[[415498]]

本文轉(zhuǎn)載自微信公眾號(hào)「三分鐘學(xué)前端」,作者sisterAn。轉(zhuǎn)載本文請(qǐng)聯(lián)系三分鐘學(xué)前端公眾號(hào)。

接口 與 類型別名 的異同點(diǎn)

相同點(diǎn)

1. 都可以描述對(duì)象或函數(shù)

  1. // 接口 
  2. interface Sister { 
  3.   name: string; 
  4.   age: number; 
  5.  
  6. interface SetSister { 
  7.   (name: string, age: number): void; 
  8.  
  9. // 類型別名 
  10. type Sister = { 
  11.   name: string; 
  12.   age: number; 
  13. }; 
  14.  
  15. type SetSister = (name: string, age: number) => void; 

2. 都可以擴(kuò)展

interface 和 type 可以混合擴(kuò)展,也就是說(shuō) interface 可以擴(kuò)展 type,type 也可以擴(kuò)展 interface。

但需要注意的是,接口的擴(kuò)展是繼承( extends )。類型別名的擴(kuò)展就是交叉類型(通過(guò) & 實(shí)現(xiàn))

  1. // 接口 
  2. interface SisterAn { 
  3.     name: string; 
  4.  
  5. // 類型別名 
  6. type SisterRan = { 
  7.     age: number; 
  1. // 接口擴(kuò)展接口 
  2. interface Sister extends SisterAn { 
  3.     age: number; 
  1. // 類型別名擴(kuò)展類型別名 
  2. type SisterPro = SisterRan & { 
  3.     name: string; 
  1. // 接口擴(kuò)展類型別名 
  2. interface Sister extends SisterRan { 
  3.     name: string; 
  1. // 類型別名擴(kuò)展接口 
  2. type SisterPro = SisterAn & { 
  3.     age: number; 

區(qū)別

官方 中這樣介紹兩者的區(qū)別:

Type aliases and interfaces are very similar, and in many cases you can choose between them freely. Almost all features of an interface are available in type, the key distinction is that a type cannot be re-opened to add new properties vs an interface which is always extendable.

意思就是說(shuō)幾乎接口的所有特性都可以通過(guò)類型別名來(lái)實(shí)現(xiàn),主要區(qū)別在于:

1. 不同的聲明范圍

與接口不同,可以為任意的類型創(chuàng)建類型別名

類型別名的右邊可以是任何類型,包括基本類型、元祖、類型表達(dá)式( & 或 | 等);而在接口聲明中,右邊必須為變量結(jié)構(gòu)。例如,下面的類型別名就不能轉(zhuǎn)換成接口

  1. type Name = string 
  2. type Text = string | { text: string }; 
  3. type Coordinates = [number, number]; 

2. 不同的擴(kuò)展形式

接口是通過(guò)繼承的方式來(lái)擴(kuò)展,類型別名是通過(guò) & 來(lái)擴(kuò)展

  1. // 接口擴(kuò)展 
  2. interface SisterAn { 
  3.     name: string; 
  4. interface Sister extends SisterAn { 
  5.     age: number; 
  6.  
  7. // 類型別名擴(kuò)展 
  8. type SisterRan = { 
  9.     age: number; 
  10. type SisterPro = SisterRan & { 
  11.     name: string; 

這里需要注意的是,接口擴(kuò)展時(shí),typescript 會(huì)檢查擴(kuò)展的接口是否可以賦值給被擴(kuò)展的接口

  1. // 接口擴(kuò)展 
  2. interface SisterAn { 
  3.     name: string; 
  4.     age: string 
  5.  
  6. interface Sister extends SisterAn { 
  7.     name: string; 
  8.     age: number; 
  9. // 報(bào)錯(cuò): 
  10. //  Interface 'Sister' incorrectly extends interface 'SisterAn'
  11. //  Types of property 'age' are incompatible. 
  12. //  Type 'number' is not assignable to type 'string' 

但使用交集類型時(shí)就不會(huì)出現(xiàn)這種情況

  1. // 類型別名擴(kuò)展 
  2. type SisterRan = { 
  3.  name: string; 
  4.     age: string; 
  5. type SisterPro = SisterRan & { 
  6.     name: string; 
  7.     age: number; 

類型別名擴(kuò)展時(shí),typescript 將盡其所能把擴(kuò)展和被擴(kuò)展的類型組合在一起,而不會(huì)拋出編譯時(shí)錯(cuò)誤

3. 不同的重復(fù)定義表現(xiàn)形式

接口可以定義多次,多次的聲明會(huì)自動(dòng)合并

  1. interface Sister { 
  2.     name: string; 
  3. interface Sister { 
  4.     age: number; 
  5.  
  6. const sisterAn: Sister = { 
  7.     name'sisterAn' 
  8. }  
  9. // 報(bào)錯(cuò):Property 'age' is missing in type '{ name: string; }' but required in type 'Sister' 
  10.  
  11. const sisterRan: Sister = { 
  12.     name'sisterRan',  
  13.     age: 12 
  14. // 正確 

但是類型別名如果定義多次,會(huì)報(bào)錯(cuò)

  1. type Sister = { // Duplicate identifier 'Sister' 
  2.     name: string; 
  3.  
  4. type Sister = { // Duplicate identifier 'Sister' 
  5.     age: number; 

如何選擇 Interface 、 Type

雖然 官方 中說(shuō)幾乎接口的所有特性都可以通過(guò)類型別名來(lái)實(shí)現(xiàn),但建議優(yōu)先選擇接口,接口滿足不了再使用類型別名,在 typescript 官網(wǎng) Preferring Interfaces Over Intersections 有說(shuō)明,具體內(nèi)容如下:

大多數(shù)時(shí)候,對(duì)象類型的簡(jiǎn)單類型別名的作用與接口非常相似

  1. interface Foo { prop: string } 
  2.  
  3. type Bar = { prop: string }; 

但是,一旦你需要組合兩個(gè)或多個(gè)類型來(lái)實(shí)現(xiàn)其他類型時(shí),你就可以選擇使用接口擴(kuò)展這些類型,或者使用類型別名將它們交叉在一個(gè)中(交叉類型),這就是差異開(kāi)始的時(shí)候。

接口創(chuàng)建一個(gè)單一的平面對(duì)象類型來(lái)檢測(cè)屬性沖突,這通常很重要! 而交叉類型只是遞歸的進(jìn)行屬性合并,在某種情況下可能產(chǎn)生 never 類型

接口也始終顯示得更好,而交叉類型做為其他交叉類型的一部分時(shí),直觀上表現(xiàn)不出來(lái),還是會(huì)認(rèn)為是不同基本類型的組合。

接口之間的類型關(guān)系會(huì)被緩存,而交叉類型會(huì)被看成組合起來(lái)的一個(gè)整體。

最后一個(gè)值得注意的區(qū)別是,在檢查到目標(biāo)類型之前會(huì)先檢查每一個(gè)組分。

出于這個(gè)原因,建議使用接口/擴(kuò)展擴(kuò)展類型而不是創(chuàng)建交叉類型。

  1. - type Foo = Bar & Baz & { 
  2. -     someProp: string; 
  3. - } 
  4. + interface Foo extends Bar, Baz { 
  5. +     someProp: string; 
  6. + } 

簡(jiǎn)單的說(shuō),接口更加符合 JavaScript 對(duì)象的工作方式,簡(jiǎn)單的說(shuō)明下,當(dāng)出現(xiàn)屬性沖突時(shí):

  1. // 接口擴(kuò)展 
  2. interface Sister { 
  3.     sex: number; 
  4.  
  5. interface SisterAn extends Sister { 
  6.     sex: string; 
  7. // index.ts(5,11): error TS2430: Interface 'SisterAn' incorrectly extends interface 'Sister'
  8. //  Types of property 'sex' are incompatible. 
  9. //    Type 'string' is not assignable to type 'number'
  1. // 交叉類型 
  2. type Sister1 = { 
  3.     sex: number; 
  4.  
  5. type Sister2 = { 
  6.     sex: string; 
  7.  
  8. type SisterAn = Sister1 & Sister2; 
  9. // 不報(bào)錯(cuò),此時(shí)的 SisterAn 是一個(gè)'number & string'類型,也就是 never 

來(lái)源:https://github.com/Advanced-Frontend/Daily-Interview-Question

 

責(zé)任編輯:武曉燕 來(lái)源: 三分鐘學(xué)前端
相關(guān)推薦

2022-09-02 09:02:44

TypeInterface

2022-05-06 09:21:21

TypeScriptinterfacetype

2019-08-28 15:38:04

Linux系統(tǒng)工具

2021-11-11 07:02:33

類型函數(shù)調(diào)用

2021-11-30 23:01:51

編程語(yǔ)言數(shù)據(jù)Python

2021-11-05 07:13:46

Python

2022-04-07 08:20:22

typeinterface前端

2025-03-07 08:44:47

Typescriptiinterfacetype

2021-06-23 08:01:18

TypeScript interface type

2020-01-17 13:33:42

大數(shù)據(jù)分析師大數(shù)據(jù)工程師

2018-06-16 14:32:16

無(wú)線路由器單頻雙頻

2021-03-15 14:09:49

電腦軟件安全

2010-03-29 17:38:18

CentOS源代碼

2020-09-23 09:08:05

typescript

2015-01-08 22:06:18

2020-06-30 09:10:35

編程學(xué)習(xí)技術(shù)

2009-09-15 09:24:42

思科認(rèn)證考試思科認(rèn)證

2022-03-13 23:31:13

JavaScript工具動(dòng)畫(huà)庫(kù)

2020-11-18 09:26:52

@property裝飾器代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)