- 原文地址:TypeScript — JavaScript with superpowers
- 原文作者:Indrek Lasn
- 譯者:liaozeen

JavaScript 很酷。但是你知道比JavaScript更酷的是什麼嗎?
是Typescript。
你能說出下面程式碼哪裡出錯了嗎?


TypeScript (左) and ES6 (右)
看到紅色下劃線了嗎?這是Typescript給我們的錯誤提示。
你可能找到這個錯誤了—— toUpperCase()
是 字串型別的方法。我們把一個整數作為引數傳入,不過整數不能呼叫 toUpperCase()
。
我們來修改它,限制 nameToUpperCase()
的引數為字串型別。

現在我們不必記住 nameToUpperCase()
只能接受一個字串作為引數,讓Typescript幫我們來記住它。想象下,如果要記住成千上萬個方法以及其引數的型別,那會瘋掉的。
但是還是出現紅色提示。這是為什麼?因為我們傳的還是一個數字!我們現在來傳個字串。

注意到Typescript會編譯成JavaScript(它只是JavaScript的超集,像C++和C)
Typescript的靜態型別檢查簡單而強大。
在上個月,TypeScript已經下載了10,327,953次。

Typescript與Flow的下載量比較
讓我們來探索Typescript世界——我們稍後會深入探討,首先明白Typescript是什麼以及為什麼存在。
TypeScript於2012年10月1日首次亮相。 它起源於微軟,由 Anders Hejlsber(領導設計C#)和他的團隊開發。
Typescript完全公開在Github上,所以任何人都可以閱讀原始碼和貢獻。

Typescript——JavaScript的超集
怎麼開始
很簡單,我們需要的是NPM包。開啟你的終端,然後跟著以下輸入:
我們應該做好Typescript的配置。

{
"compilerOptions": {
"target": "es5",
"module": "commonjs"
}
}
複製程式碼
我們需要做的是建立.ts
檔案,並告訴Typescript監測程式碼的變化,並進行編譯。
執行以下命令進行程式碼監測:
tsc -w
複製程式碼
tsc—Typescript的編譯指令
這就是我們最終生成的檔案

現在你可以按照我們的例子來完成!
我們在.ts
檔案裡寫程式碼,.js
檔案是給瀏覽器讀取的。在本文的例子中,我們沒有用瀏覽器,而是使用Node.js(Node也能讀.js
)

JavaScript有七種資料型別,其中六種是基礎型別,剩下的一種是物件型別。
JavaScript 的基礎型別有:
- String
- Number
- Undefined
- Null
- Symbol
- Bollean
剩下的是物件型別

Typescript除了和JavaScript一樣有基礎型別,也擴充了額外的型別。
這些額外的型別是可選的,如果你不熟悉,你不一定要使用。
額外的型別如下:
Tuple

可以把 tuple 想象為有結構的陣列。你按順序預先定義陣列元素的型別。

如果我們不按 tuple 的相應位置的型別分配相應的型別,Typescript會提示我們規則錯誤。
void

tuple
期望第一個變數是 number
型別—在這裡例子中,它不是數字型別,而是字串 "Indrek"
,所以會提示我們錯誤。

在typescript裡,你必須在函式裡定義返回型別。像這樣:有些函式沒有 return語句

注意我們如何宣告引數型別和返回型別 - 兩者都是字串。
現在看看如果我們不返回任何東西會發生什麼?

可以看到Typescript編譯程式告訴我們:"你定義了返回型別為字串,但現在卻沒有返回任何東西。現在告訴你,我們沒有遵守提示的規則。"
如果我們不知道需要返回什麼時怎麼辦?這種情況我們可以使用 Void
定義返回型別。

但是在這個例子裡,如果我們要返回一個值,我們就不能定義返回型別為 void
。

Any

any
型別非常簡單。如果我們不知道是什麼型別時可以使用 any
。

注意到我們多次給 person
重新分配不同型別的值。第一次是字串,然後是數字,最後是布林值。我們不確定其型別。
現實世界的例子是,如果你使用第三方庫而你不知道型別。
我們來建立一個陣列,把一些資料儲存在陣列裡。陣列是由不同型別的資料組成,不僅僅是字串,或數字,又或者有結構的型別,像 tuple
。any
型別就會起作用。

如果你的陣列裡只是一種型別,你可以明確告訴編譯器,像這樣:

如果你想了解更多,這裡有文件介紹。