TypeScript 簡明教程:認識 TypeScript

Hopsken發表於2019-02-27

本文為系列文章《TypeScript 簡明教程》中的一篇。

  1. 認識 TypeScript
  2. 安裝 TypeScript

作為一名 JavaScript 開發者,如果你總在擔心程式碼上線後會不會冷不丁報個 undefined,如果你寫程式碼時總需要在檔案間來回跳轉查閱介面,如果你正準備接手一個大型 JS 專案,那麼,該是時候考慮使用 TypeScript 了。

TypeScript 是什麼

根據 TS 官網 的介紹:TypeScript 是 JavaScript 型別的超集,它可以編譯成純 JavaScript。換句話說,TypeScript 就是增強版的 JavaScript。這一點,從 TypeScript 的名字也可以看出,TypeScript = Type(型別) + JavaScript。

那麼,為什麼要給 JavaScript 來這麼個『增強』了?這就要從 JavaScript 的發展史說起了。

最初,JavaScript 是專為瀏覽器而設計的語言。起初只是用於處理基本的使用者互動,比如表單處理、顯示彈窗等。JS 本身作為一門動態語言,並沒有型別系統,因為它壓根就不是為了建造大型應用而設計的。

可是最近幾年,JavaScript 飛速發展。Node.js 的出現,使得 JS 不再侷限於瀏覽器中;而 SPA(單頁應用)的流行,使得前端逐漸邁向工程化,專案的程式碼量急速膨脹。隨之而來的問題就是,與 C#、Java 等更成熟的語言不同,JS 並不具備這樣的規模化能力。鬆散的程式碼、紛亂的型別為專案帶來了更多的不可控性和不確定性。

為了解決這個問題,大公司們開始尋求解決方案。而 TypeScript 就是 Microsoft 給出的回答,並且由 C# 之父 Anders Hejlsberg 領銜打造。

TypeScript 為 JavaScript 補全了構建大型應用時不可或缺的一塊:型別系統,為開發者架上了一張安全網。同時,作為 JS 的增強版,TS 仍然存在於 JS 的生態中,你依然可以使用 JS 社群提供的各種庫,只需要加上一份宣告檔案即可(多數情況下社群都有現成的)。

TypeScript 簡明教程:認識 TypeScript

事實證明,TypeScript 是成功的。近兩年來,TypeScript 的發展勢頭很猛。就拿前端三大框架來說,根據 Evan You 釋出的 Vue 3.0 計劃,Vue 3.0 將完全使用 TypeScript 重寫;React 及其周邊生態都在積極擁抱 TypeScript,知名的 React 元件庫 Ant Design 就是使用 TypeScript 編寫;Angular 就更不用說了,Angular 自身就是用 TypeScript 編寫的,預設使用的開發語言也是 TypeScript。TypeScript 流行程度可見一斑。

值得一提的是,根據 StateOfJS 2018 報告,TypeScript 的使用滿意率高達 90%

什麼是型別系統

我們都知道,JavaScript 中的資料可以分為基礎資料型別和引用資料型別。基礎資料型別包括:undefinednullbooleannumberstringsymbol(ES6 新增)。除了基礎資料型別以外的,就是引用型別,包括:ObjectArrayDateFunctionRegExp 等等。這裡說的型別其實就是 TypeScript 中的 Type。只不過在 JavaScript 中,我們不需要把變數的型別明確寫出來,而且,同一個變數可以賦值為不同型別的資料。但是在 TypeScript 中,每一個變數的型別都是確定的,不同型別的資料之間不能賦值。

舉個例子:

// JavaScript
let name = 'Hopsken'
name = 5 // 沒啥問題

// TypeScript
let name: string = 'Hopsken'
name = 5    // Error: Type '5' is not assignable to type 'string'.
複製程式碼

除此以外,TS 中,我們還可以指明函式的型別。通過宣告函式應該接收什麼型別的資料,返回什麼型別的資料,可以有效地避免許多低階錯誤的出現。

// TypeScript
function sayHi(person: string) {
    return 'Hi, '![5f17444dc4b93c0801dbc95c2b215d81.gif](evernotecid://CBBD808E-8BA9-4E6F-8C37-654C8A05B11E/appyinxiangcom/10452354/ENResource/p2337)
    + person
}

sayHi(42) // Error: Argument of type '42' is not assignable to parameter of type 'string'.
複製程式碼

強調:TypeScript 使用靜態型別系統,只在編譯時進行型別分析,最終編譯出的 JS 原始碼中 **不含任何型別檢查的程式碼**(自行新增的除外)。這一點要與執行時檢查加以區分。

總而言之,型別系統就是定義如何將數值和表示式歸類為許多不同的型別,如何操作這些型別,這些型別又該如何互相作用。通過型別,我們可以確認一個值或者一組值特定的意義和目的。

型別系統的益處

提前檢測錯誤。

靜態型別系統的首要優點就是,能儘早發現邏輯錯誤,而不是到真正上線執行的時候才發現。JavaScript 鬆散的語法,在帶來方便的同時,也讓它變得很脆弱。通過上面的兩個例子,可以感受到靜態型別分析帶來的優勢。舉個例子,相信不少人在 JavaScript 開發中,都遇到過『強制型別轉換』的坑,而使用 TypeScript 則可以有效地避免這種問題,原因自然是不言而喻。

舒適的開發體驗。

首先,型別系統的存在為很多輔助開發的工具提供了可能。比如說,當你呼叫函式時,現代的編輯器可以清楚地告訴你該函式需要幾個引數、引數是什麼型別的、哪些引數是可選的。這樣可以省去大量查閱 API 的時間,提高開發效率。

TypeScript 簡明教程:認識 TypeScript

其次,型別具有一定的自解釋(self-explain)能力。而型別就像是對程式自身的註釋。畢竟,程式碼寫出來是讓人讀的。很多時候,光是看型別本身,我們就能理解某段程式的意圖。與純人工註釋不同,隨著專案的不斷迭代,人工註釋可能會越來越詞不達意,但型別標註卻可以始終忠實地反映程式本身的意義。

更強大的是,藉助某些工具,可以根據型別標註自動生成文件。詳情請參閱 typedoc

更高的抽象性。

型別系統允許程式設計者對程式以較高層次的方式思考,將設計者從煩人的低層次實現中解脫出來,有一種提綱挈領的感覺。設計者可以通過設計子系統間的介面,來表達程式的邏輯。也就是說,讓設計脫離實現,體現出一種 IDL(介面定義語言)的感覺,讓程式設計迴歸本質。

總結

本文主要回答了三個問題:TypeScript 是什麼、什麼是型別系統、型別系統可以帶來什麼好處。現在我們知道,TypeScript 實際上是對 JavaScript 的一個補充,讓使用 JavaScript 開發大規模應用成為了可能。

TypeScript 是個非常強大的工具,它引入了一系列我們以前在 JavaScript 程式中沒有考慮過的技術概念。TS 為我們帶來的不只是語法上的變化,更多地是思想上的變化。相信我,隨著學習的深入,對於這一點的感受會越來越深。

下期預告

與 TypeScript 的火爆形成對比,國內圍繞 TypeScript 的教程卻比較缺乏。《TypeScript 簡明教程》旨在彌補這一缺失,幫助新手快速上手 TypeScript。下期我們將講解 TypeScript 中的基本型別,敬請關注。 ( ̄▽ ̄)~

相關文章