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