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 支援。

2.1 ECMAScript 6 支援

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

語言特性

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

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

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

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

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

3.1 型別批註

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

function add (left: number, right: number): number {return left + right;}

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

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

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

3.1.1 宣告檔案

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

宣告檔案的概念類似於 C／C++ 中標頭檔案的概念。

declare module Arithmetics {export function add (left: number, right: number): number;

export function subtract (left: number, right: number): number;

export function multiply (left: number, right: number): number;

export function divide (left: number, right: number): number;

}

可以為已存在的 JavaScript 庫（如 jQuery 和 Node.js）撰寫型別宣告檔案。

3.2 類別

TypeScript 支援集成了可選的類別批註支援的 ECMAScript6 的類。

class Person {

private name: string;

private age: number;

constructor (name: string, age: number){

this.name = name;

this.age = age;

}

toString : string {return `${this.name}(${this.age})`;

}

}

3.3 函式

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

function id (x: T): T {return x;}

3.4 模組和名稱空間

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

與 JavaScript 的相容性

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

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

支援的瀏覽器和平臺

沒有任何瀏覽器或者執行時能夠直接執行不經處理的 TypeScript 程式碼，因為 TypeScript 中的型別註解等特性並不在 ECMAScript 規範之中。

Node.js 自 22.6.0 版本開始，便提供了少部分實驗性的 TypeScript 支援。Bun、Deno 等 JavaScript 執行時也提供了直接執行 TypeScript 檔案的功能，編譯到 JavaScript 的工作會在內部發生，不需要使用者手動進行操作。

開發工具

6.1 編譯器

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

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

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

6.2 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 也有一個， 由 Basarat 開發，支援程式碼補全、跳轉、格式化和快速完成。
線上的 Cloud9 IDE 和 Codenvy 也支援 TypeScript。
NetBeans 也有一個
Eclipse IDE（Kepler）也有一個
也是一個 Eclipse IDE 外掛
Microsoft 為 Sublime Text 提供了
跨平臺雲 IDE Codeanywhere 支援 TypeScript
是一個 Eclipse 外掛，用於開發 和 Angular 2
是一個可以從 npm 安裝的 IDE，可以開發和 Angular 2 應用，整合終端支援
Tide — Emacs 的 TypeScript 互動開發環境

開源

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

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