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發布，其中包含許多新功能，例如 剩餘參數、展開語法、帶有元組的剩餘參數、帶有通用類型的剩餘參數等。

2020年8月20日，TypeScript 4.0 釋出。雖然這個版本沒有引入任何重大變更，但它新增了自訂 JSX 工廠（Custom JSX Factories）和可變動元組型別（Variadic Tuple Types）等功能。

2023年3月16日，TypeScript 5.0 釋出，其中引入了對裝飾器（decorators）的支援。

2025年3月11日，安德斯·海爾斯伯格在 TypeScript 部落格上宣布，團隊正在開發一個使用 Go 語言編寫的 TypeScript 編譯器，預計在今年以 TypeScript 7.0 版本釋出。這個新編譯器預期能帶來10倍的效能提升。

## 設計背景

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常規的動態類型。

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

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

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

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

#### 聲明文件

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

聲明文件的概念類似於C／C++中頭文件的概念。

```typescript
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）撰寫類型聲明文件。

### 類別

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

```typescript
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})`;
    }
}
```

### 函式

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

```typescript
function id<T>(x: T): T {
    return x;
}
```

### 模組和命名空間

在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的工作會在內部發生，不需要使用者手動進行操作。

## 開發工具

### 編譯器

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也有一個，由Basarat開發，支持代碼補全、跳轉、格式化和快速完成。
- 在線的Cloud9 IDE和Codenvy也支持TypeScript。
- NetBeans也有一個
- Eclipse IDE（Kepler）也有一個
- https://web.archive.org/web/20140720235749/http://www.typecsdev.com/也是一個Eclipse IDE插件
- Microsoft為Sublime Text提供了
- 跨平台雲IDE Codeanywhere支持TypeScript
- https://www.genuitec.com/products/webclipse/ 是一個Eclipse插件，用於開發 和 Angular 2
- https://www.genuitec.com/products/angular-ide/是一個可以從npm安裝的IDE，可以開發 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、代碼完成和句法高亮方法。

## 外部連結

- TypeScript官方網站
- Typescript中文網
- list of languages that compile to JS

## 基本資料

- 編程范型：多范型：函數式、泛型、指令式、面向對象
- 發行日期：2012年10月1日
- 設計者：微軟
- 開發者：微軟
- 類型系統：鴨子類型, 漸進類型, 結構類型
- 施影響於：AtScript、AssemblyScript
- 許可證：Apache 許可證 2.0
- 受影響於：C#、Java、JavaScript
- 文件擴展名：.ts, .tsx