TypeScript

**TypeScript** 是由微軟進行開發和維護的一種開源的程式語言。TypeScript 是 JavaScript 的嚴格語法超集，提供了可選的靜態型別檢查。

TypeScript 的知名開發者有 C# 的首席架構師兼 Delphi 和 Turbo Pascal 的創始人 —— 安德斯・海爾斯伯格。

TypeScript 是為開發大型應用程式而設計的，且可轉譯成 JavaScript。由於 TypeScript 是 JavaScript 的嚴格語法超集，因此任何現有的 JavaScript 程式都是合法的 TypeScript 程式。

TypeScript 支援為現存 JavaScript 函式庫添加型別資訊的定義檔案，方便其他程式像使用靜態型別的 TypeScript 實體一樣，使用現有程式庫中的值，就像是 C++ 的標頭檔可以描述目的檔（objectfile）的結構一樣。有許多第三方標頭檔為熱門函式庫像是 jQuery、MongoDB、Node.js 和 D3.js 等提供定義檔案。

TypeScript 編譯器本身也是用 TypeScript 編寫，並被轉譯為 JavaScript，以 Apache 授權條款第二版釋出。

## 背景

經過微軟兩年的內部開發後，TypeScript 於 2012 年 10 月首次釋出（0.8 版本）。在釋出後不久，Miguel de Icaza 認可了這門語言，但批評了其糟糕的 IDE 支援性，僅有 Microsoft Visual Studio IDE 支援其代碼，但此 IDE 當時未在 Linux 和 OS X 作業系統上釋出。如今，在其他 IDE 中（例如：Eclipse），通過 Palantir Technologies 提供的外掛程式支援，能支援 TypeScript 語法。大部分主流的文字編輯器，例如：Emacs、Vim、WebStorm、Atom 和微軟釋出的 Visual Studio Code 也能支援 TypeScript 語法。

2013 年釋出的 TypeScript 0.9 增加了對泛型的支援。TypeScript 1.0 在 2014 年的微軟開發者大會上釋出。Visual Studio 2013 Update 2 為 TypeScript 提供了原生支援。

2014 年 7 月，開發團隊釋出了新的 TypeScript 編輯器，聲稱其效能提高了 5 倍。同時，代碼代管由 CodePlex 遷移至 GitHub。

2016 年 9 月 22 日，TypeScript 2.0 釋出，其中引入了幾個功能，例如開發者可以選擇不為變數分配空值等。

2018 年 7 月 30 日，TypeScript 3.0 釋出，其中包含許多新功能，例如剩餘參數（頁面存檔備份，存於網際網路檔案館）、展開語法（頁面存檔備份，存於網際網路檔案館）、帶有元組的剩餘參數、帶有通用類型的剩餘參數等。

## 設計背景

TypeScript 起源於 JavaScript 在微軟以及客戶中開發大型應用中遇到的缺點。處理複雜 JavaScript 代碼帶來的挑戰使他們需要自訂工具來簡化組件開發流程。

TypeScript 開發者尋求一種不破壞現有標準相容性和跨平台支援的解決方案。直到 ECMAScript 標準為未來類別為基程式設計提供支援後，Typescript 開發便基於此方案。這形成了包含一組新的語法擴充的一個 JavaScript 編譯器，一個基於此提案的超集，可將 TypeScript 語法編譯為常規的 JavaScript。從這個意義上來講，TypeScript 是 ECMAScript2015 預期內容的預覽版本。提案中未包括的可選靜態型別被添加到了 TypeScript 中，有助於促進工具和 IDE 支援。

### ECMAScript 6 支援

TypeScript 添加了 ECMAScript 2015 標準中定義的類、模組和箭頭函式等語法的支援。

## 語言特性

TypeScript 是一種為 JavaScript 添加特性的語言擴充。增加的功能包括：

* 類型批註和編譯時型別檢查
* 類型推斷
* 類型擦除
* 介面
* 列舉
* Mixin
* 泛型程式設計
* 命名空間
* 元組
* async/await

以下功能是從 ECMA 2015 反向移植而來：

* 類
* 模組
* 匿名函式的箭頭語法
* 可選參數以及預設參數

在語法上，TypeScript 很類似 JScript .NET，它是另外一個微軟對 ECMA-262 語言標準的實現，添加了對靜態型別、經典的物件導向語言特性（如類、繼承、介面和命名空間等）的支援。

### 類型批註

TypeScript 通過類型批註提供靜態型別，以在編譯時啟動型別檢查。這是可選的，而且可以忽略而使用 JavaScript 常規的動態型別。

對於基本類型的批註是 `number`、`boolean` 和 `string`。而弱型別或動態型別的結構則是 `any` 類型。

類型批註可以被匯出到一個單獨的「聲明檔案」，讓使用已被編譯為 JavaScript 類型的 TypeScript 指令碼中的類型資訊仍可用。批註可以為現有的 JavaScript 庫聲明，就像 Node.js 和 jQuery 所做的那樣。

沒有給出類型時，TypeScript 編譯器會利用類型推斷來推斷類型。如果由於缺乏聲明而不能推斷出類型，那麼它的類型將預設為動態 `any` 類型。

#### 聲明檔案

當一個 TypeScript 指令碼被編譯時，有一個產生作為編譯後的 JavaScript 的組件的一個介面而起作用的聲明檔案（具有副檔名 `.d.ts`）的選項。在這個過程中編譯器基本上帶走所有的函式和方法體而僅保留所匯出類型的批註。當第三方開發者從 TypeScript 中使用它時，由此產生的聲明檔案就可以被用於描述一個 JavaScript 庫或模組匯出的虛擬的 TypeScript 類型。

聲明檔案的概念類似於 C／C++ 中標頭檔的概念。

可以為已存在的 JavaScript 庫（如 jQuery 和 Node.js）撰寫類型聲明檔案。

### 類別

TypeScript 支援整合了可選的類別批註支援的 ECMAScript6 的類。

### 函式

TypeScript 支援函式程式設計。以下為恆等函式的範例：

### 模組和命名空間

在 TypeScript 中，模組和命名空間是被區分開的。這兩項功能在 TypeScript 中皆支援將類型、介面、函式和變數封裝至容器內。命名空間（舊稱內部模組）使用 JavaScript 的立即呼叫函式表達式來封裝程式碼，而模組（舊稱外部模組）則是以 JavaScript 函式庫模式來達成（非同步模組定義或 CommonJS）。

## 與 JavaScript 的相容性

TypeScript 是 JavaScript 的超集。預設情況下編譯器以 ECMA Script 3（ES3）為目標但 ES5 也是受支援的一個選項。一個 TypeScript 應用可以利用已存在的 JavaScript 指令碼。編譯後的 TypeScript 指令碼也可以在 JavaScript 中使用。

現有框架如 jQuery 和 Node.js 等受到完全支援。這些庫的類型聲明在原始碼中提供。

## 支援的瀏覽器和平台

執行於任何平台上的任何網頁瀏覽器都可以執行 TypeScript:由於它僅僅是被編譯為標準的 JavaScript，一個指令碼既可以被預編譯為 JavaScript，也可以通過為 TypeScript 包含 JavaScript 編譯器即時編譯。

## 開發工具

### 編譯器

TypeScript 編譯器，叫做 `tsc`，本身也是用 TypeScript 寫成的。可以將 TypeScript 編譯為可以在任何 JavaScript 引擎（如瀏覽器）中執行的標準 JavaScript。編譯器包也包含了指令碼直譯器，用來執行編譯器。同時也有個 Node.js 包，在 Node.js 平台執行。

另外還有一個用 JavaScript 寫的 alpha 版本的客戶端編譯器，它在頁面載入時，即時執行 TypeScript 代碼。

這種編譯器的目前版本預設支援 ECMAScript 2015。一個選項是允許以 ECMAScript 2015 為目標，以利用該版本獨有的語言特性（比如生成器）。類是 ECMAScript 2015 標準的一部分，在這兩個模式下都可以使用。

### IDE 和編輯器支援

* 微軟為 Visual Studio 2012 和 WebMatrix 提供了一個外掛程式，在 Visual Studio 2013 和 Visual Studio 2015 中內嵌了支援，也為 Sublime Text、Emacs 和 Vim 提供了基本的文字編輯器支援。
* Visual Studio Code 是一個開源的、跨平台的代碼編輯器，是微軟在 Electron 的基礎上開發的。它支援 TypeScript，同時也支援其他幾個語言，同時提供了除錯和自動代碼補全的功能。
* JetBrains 在他們的 IDE 系列中支援 TypeScript，而且已經發行了具有部分支援的 PhpStorm 6 和 WebStorm 6 以及 IntelliJ IDEA。同時他們的 Visual Studio 擴充 ReSharper （頁面存檔備份，存於網際網路檔案館）8.1 也支援。
* Atom 也有一個 TypeScript 外掛程式， 由 Basarat 開發，支援代碼補全、跳轉、格式化和快速完成。
* 線上的 Cloud9 IDE 和 Codenvy 也支援 TypeScript。
* NetBeans 也有一個外掛程式
* Eclipse IDE（Kepler）也有一個外掛程式
* TypEcs 也是一個 Eclipse IDE 外掛程式
* Microsoft 為 Sublime Text 提供了 TypeScript 外掛程式
* 跨平台雲 IDE Codeanywhere 支援 TypeScript
* Webclipse 是一個 Eclipse 外掛程式，用於開發 TypeScript 和 Angular 2
* Angular IDE 是一個可以從 npm 安裝的 IDE，可以開發 TypeScript 和 Angular 2 應用，整合終端支援
* Tide （頁面存檔備份，存於網際網路檔案館） — Emacs 的 TypeScript 互動開發環境

## 開源

TypeScript 是開源的，其原始碼可以在 Apache 2 License 下從 Github 獲得。這個專案由 Microsoft 維護，但是任何人可以通過在 Github 計畫頁傳送回饋、提出建議和提交 bugfixes 而做出貢獻。

已有一些批評提到，TypeScript 鼓勵強型別，當前只有 Microsoft Visual Studio 支援在該語言上方便開發。最初的方案是在其它的編輯器上帶來強型別，IntelliSense、代碼完成和代碼重構的功能，但這可能不是一個簡單的任務。此外，支援 TypeScript 開發的 Visual Studio 擴充不是開源的。最好的 TypeScript 開發體驗是在 Microsoft Windows 上，然而隨著時間的流逝以及這種語言的開放性，加之編譯器自我代管，而且用 TypeScript 自身寫的，這很有可能會改變。通過編譯器的原始碼存取到 AST（抽象句法樹）以及詳細的語言規範文件，社群已開始構建一個跨平台的編輯器，利用和 Visual Studio 所用到的相同的語言服務以提供一個增強的編輯體驗。編輯器仍然在概念檢驗的階段，但已經執行於 Linux、macOS 和 Windows，提供功能強度相同的 IntelliSense、代碼完成和句法突顯方法。

## 參見

* JavaScript
* ECMAScript

### 其它編譯為 JavaScript 的語言

* CoffeeScript
* Dart
* HaXe

## 參考資料

## 外部連結

* TypeScript 官方網站（頁面存檔備份，存於網際網路檔案館）
* TypeScript 範例（頁面存檔備份，存於網際網路檔案館）
* list of languages that compile to JS（頁面存檔備份，存於網際網路檔案館）