成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

請停止使用 TypeScript 接口

開發
今天,我們將評估類型和接口,然后得出結論,說明為什么你在大多數情況下應該使用類型而不是接口。

為什么應該使用類型而不是接口

這張圖片是由人工智能生成的。

類型和接口 是每個 TypeScript 程序中使用的重要特性。

然而,由于類型和接口在功能上非常相似,這就引出了一個問題:哪個更好?

今天,我們將評估類型和接口,然后得出結論,說明為什么你在大多數情況下應該使用類型而不是接口。

所以,不多說了……讓我們馬上開始吧。

那么它們有什么區別呢?

讓我們分析一下這個 Person 類型 和 接口 的定義:

type Person = {
  name: string
  age: number
}

interface Person {
  name: string
  age: number
}

很明顯,類型和接口有相似的語法,關鍵區別在于類型使用 = 來定義對象的形狀,而不是接口。

然而,事情遠不止于此。

讓我們深入挖掘一下,一起探索和評估類型和接口。

可擴展性

就可擴展性而言,許多人認為接口是顯而易見的贏家,因為接口可以使用 extends 擴展其他接口。

// 可擴展性示例

interface Job {
  job: string
}

interface Person extends Job {
  name: string
  age: number
}

// 使用了 Person 和 Job 的屬性。
const person: Person = {
  name: "John",
  age: 25,
  job: "全棧 Web 開發者",
}

在這里,Person 接口擴展了 Job,因此 Job 接口的屬性合并到了 Person 中。

另一方面,類型也通過利用 聯合 | 或 交集 & 運算符來合并現有類型,提供了可擴展性。

接口無法直接表達這種行為。

// ? 正常工作
type Person = {
  name: string
  age: number
} & { job: string }

// ? 不工作
interface Person {
  name: string
  age: number
} & { job: string }

實現

在 TypeScript 中,接口與面向對象編程(OOP)兼容,就像其他語言(例如 Java 或 C#)一樣。

這意味著接口可以在類中使用 implements 實現。

現在讓我們將 Person 定義為一個類,并實現一個名為 Work 的新接口,滿足它們之間的約定。

// 實現示例

interface Work {
  doWork: () => void
}

class Person implements Work {
  name: string
  age: number

  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
  // 實現 doWork 方法以滿足 `Work` 接口。
  doWork() {
    console.log("工作中...")
  }
}

const person = new Person("John", 25)
person.doWork()

因此,如果你經常使用 OOP,接口將比類型更適用,因為類型不能直接由類實現。

性能

當談論性能時,我們指的是 TypeScript 編譯器執行的 “類型檢查” 性能,隨著代碼庫規模的增加,其性能會呈指數級下降。

這就是為什么我們要對類型和接口在類型檢查性能方面進行基準測試,看看哪個更優。

這是一個視頻,由 Matt Pocock 解釋了類型和接口之間的區別,以及在類型檢查性能方面實際上 沒有 類型和接口之間的任何差異。

接口為什么會有害

在 TypeScript 中,接口具有一個稱為 聲明合并 的獨特特性。

聲明合并是指 TypeScript 編譯器將 兩個或多個 具有相同名稱的接口合并為 一個。

// 初始的 Person 接口
interface Person {
  name: string
  age: number
}
// 使用 "聲明合并" 來完善 Person 接口
interface Person {
  gender: string
}

// 使用 "合并" 接口來定義一個新的 "person"
const person: Person = { name: "John", age: 25, gender: "男性" }

一方面,這個特性允許方便地對現有接口進行細化和擴展,而不會影響其他依賴項。

另一方面,聲明合并可能會對你的代碼庫產生有害且令人驚訝的影響,主要有以下 兩個 原因:

  • 優先級順序:后面的聲明總是優先于前面的聲明。如果不小心,當在程序的許多部分進行聲明合并時,這可能導致意外問題。
  • 與類的不安全合并:由于 TypeScript 編譯器不檢查屬性的初始化,這可能導致意外的運行時錯誤。

類型沒有這個問題,因此更直接且安全。

結論

除非需要特定的接口行為,例如可擴展的細化或使用 OOP 進行實現,否則最好使用類型。

類型靈活、直接,并且避免與聲明合并相關的問題。

與接口相比,類型在性能上也完全相同,為你提供了另一個選擇類型而不是接口的理由。

責任編輯:趙寧寧 來源: 技術的游戲
相關推薦

2020-10-23 09:57:23

TypeScriptany代碼

2023-08-29 17:47:02

嵌套 if開發

2023-05-05 00:03:29

forEach函數開發

2020-04-14 12:12:20

JavaScriptIIFE函數

2024-06-03 00:01:00

2024-06-17 08:04:23

2013-09-22 17:08:37

RSA加密組件

2017-09-18 13:34:44

Facebook

2024-09-09 08:35:30

2024-09-03 08:36:21

2020-07-15 10:32:34

5G網絡華為

2024-09-29 07:00:00

JavaScriptTypeScriptfor...of循環

2024-09-28 10:13:14

2022-03-16 00:07:55

OAuth2授權框架

2023-02-24 09:38:22

UbuntuFlatpak

2020-12-28 14:22:33

GoogleChromiumWindows 7

2024-05-11 18:48:40

技巧代碼技能

2012-09-19 15:30:59

2023-05-24 16:41:41

React前端

2016-12-09 15:02:02

云計算
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91综合网 | 看一级黄色毛片 | 欧美国产在线一区 | 日韩视频在线播放 | 国产亚洲精品久久久久久豆腐 | 黄色免费在线观看网站 | 欧美一级毛片在线播放 | 福利国产 | 一区在线观看 | 自拍偷拍欧美 | 在线视频一区二区三区 | 综合色久| 免费观看成人鲁鲁鲁鲁鲁视频 | 国产精品久久久久久久久图文区 | 久久精品亚洲 | 日韩高清电影 | 色婷婷av一区二区三区软件 | 成人在线观看网址 | 日韩手机视频 | 欧美国产日韩精品 | 日韩1区2区| 日日日操 | 国产99视频精品免视看9 | 国产一伦一伦一伦 | 国产欧美精品 | 欧美在线观看一区 | 精品国产一区二区三区性色av | 亚洲精品国产电影 | 超碰成人在线观看 | 黄色一级大片在线免费看产 | 日韩欧美国产一区二区三区 | 超碰97免费观看 | 一区二区三区四区电影 | 成人国产一区二区三区精品麻豆 | 国产精品日韩欧美一区二区三区 | 91视频免费视频 | 一区二区三区亚洲 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 国产一区在线免费观看视频 | 国产精品一区在线观看 | 成人在线精品视频 |