- 原文地址:Typescript : class vs interface
- 原文做者:Valentin PARSY
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:xueshuai
- 校對者:
不管是在 Java 或 Typescript 中,接口和類的定義是不一樣的。javascript
我想指出一個我今天看到了不少次的錯誤。在這段 Typescript 的代碼中我發現:前端
class MyClass {
a: number;
b: string;
}
複製代碼
不!絕對不對。太讓人難受了。可是真正讓人難受的是接下來讀到的:java
class MyOtherClass extends MyClass {
c: number;
}
複製代碼
哎呀呀!我知道這可能對來自一種 OOP 語言的人有一些困惑,可是在 Javascript 中,一個對象不是一個類的實例。我已經寫 C++ 快10年了,因此我理解當咱們這樣作時是對的:android
let mine = new MyClass();
複製代碼
你生成了一個‘object’。可是你別忘了 Javascript 不是一個基於類的語言,他用的是原型方法(閱讀下面的文章或者其餘的解釋這個的東西來掌握全部的這些是怎麼回事)。ios
Typescript 的一個核心原則是類型檢查,它關注的是值所擁有的_shape_。git
接口就是約定。一個接口定義了一個對象裏面擁有的東西(再一次強調...不是一個類的實例)。當你定義你的接口:程序員
interface MyInterface{
a: number;
b: string;
}
複製代碼
你的意思是任何繼承了這個約定的對象必定是一個擁有這兩個(不會多,也不會少)特別的被稱爲‘a’和‘b’的屬性,他們分別是數字型和字符串型。當你不遵照這個約定的時候,Typescript 將會拋出一個錯誤(例如,若是函數的參數符合 MyInterface,你不能傳遞任何別的參數)。github
讓咱們來看一看 Typescript 文檔中關於類的定義的第一行:typescript
傳統的 Javascript 使用函數和基於原型的繼承來構造可服用的組件,可是這會讓那些對面向對象方法更舒服的程序員感到一些尷尬,在面向對象方法中,類繼承了功能,而對象是經過類來構造的。後端
在 Typescript 中關於類的第一行的定義是「來自 OOP 世界的程序員對基於原型的繼承會感到困惑」。因而我儘量的想「這就是 Typescript 中存在類的主要緣由」(但那可能只是我這麼認爲)。
Javascript 的類,在 ECMAScript 2015的介紹中,主要是 Javascript 基於原型繼承的語法糖。類的語法沒有想 Javascript 中引入一個新的面向對象的繼承模型。
你不能對 Javascript 中的類更清楚了(擴展一下,在 Typescript中也是同樣)
當你定義一個約定,你是想使用一個接口。必定是的,不可辯駁……可是,當你想使用一個類的時候呢?
John Papa 已經在他的文章中指出了他的定義:
無論贊成或者不一樣意,但正如他所說的:「類很好,可是在 Javascript 中它們不是必須的」。我想說的是,既然它們已經存在並且讓不少人的工做變得更輕鬆,那無論是什麼緣由,你均可以使用它們,只要你記住,它仍然是 Javascript 和原型。
可是爲何這麼積極地介紹這些呢?
在 Typescript 網站上有一個很棒的工具叫作「Playground」。
你在左邊寫 Typescript 的代碼,右邊就會顯示通過轉換的 Javascript 代碼。
好吧,那是不少的 Javascript 代碼!
如今,若是咱們用接口來定義相同的約定:
什麼都沒有!由於 Typescript 只是使用接口來檢查你是否在編譯階段最瘦了約定,他不會轉換爲任何 Javascript 代碼(和類相反)。因此當我看到一個類定義了約定,我實際上在個人腦海中看到了第一張圖片,那很受傷。順便說一句,一個只有接口的文件最終是一個空文件。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。