跳转到主要内容
Chinese, Simplified
SEO Title

TypeScript 是由 Microsoft 开发和维护的免费开源编程语言。 它是 JavaScript 的严格语法超集,并为该语言添加了可选的静态类型。 它专为开发大型应用程序和转译为 JavaScript 而设计。  由于它是 JavaScript 的超集,现有的 JavaScript 程序也是有效的 TypeScript 程序。

TypeScript 可用于开发用于客户端和服务器端执行的 JavaScript 应用程序(与 Node.js 或 Deno 一样)。 有多个选项可用于转译。 可以使用默认的 TypeScript 编译器, 或调用 Babel 编译器将 TypeScript 转换为 JavaScript。

TypeScript 支持可以包含现有 JavaScript 库类型信息的定义文件,很像 C++ 头文件可以描述现有对象文件的结构。 这使其他程序能够使用文件中定义的值,就好像它们是静态类型的 TypeScript 实体一样。 jQuery、MongoDB 和 D3.js 等流行库都有第三方头文件。 Node.js 库模块的 TypeScript 标头也可用,允许在 TypeScript 中开发 Node.js 程序。 

TypeScript 编译器本身用 TypeScript 编写并编译为 JavaScript。 它根据 Apache License 2.0 获得许可。 Anders Hejlsberg 是 C# 的首席架构师,也是 Delphi 和 Turbo Pascal 的创建者,他一直致力于 TypeScript 的开发。

历史


经过两年的 Microsoft 内部开发,TypeScript 于 2012 年 10 月向公众发布了 0.8 版。在最初的公开发布后不久,Miguel de Icaza 称赞了语言本身,但批评了除了当时在 Linux 和 OS X 上不可用的 Microsoft Visual Studio 之外缺乏成熟的 IDE 支持。截至 2021 年 4 月,其他 IDE 和文本编辑器都支持,包括 Emacs、Vim、WebStorm、Atom 和微软自己的 Visual Studio Code。2013 年发布的 TypeScript 0.9 增加了对泛型的支持。

TypeScript 1.0 于 2014 年在微软的 Build 开发者大会上发布。  Visual Studio 2013 Update 2 提供了对 TypeScript 的内置支持。  2014 年 7 月,开发团队宣布了一个新的 TypeScript 编译器,并声称其性能提高了五倍,进一步改进。 同时,最初托管在 CodePlex 上的源代码已移至 GitHub。 

2016 年 9 月 22 日,TypeScript 2.0 发布,引入了多项功能,包括程序员可选择强制执行空安全的能力, 有时被称为十亿美元的错误。

TypeScript 3.0 于 2018 年 7 月 30 日发布, 带来了许多语言添加,例如剩余参数和展开表达式中的元组、具有元组类型的剩余参数、通用剩余参数等。 

TypeScript 4.0 于 2020 年 8 月 20 日发布。虽然 4.0 没有引入任何重大变化,但它添加了语言特性,例如自定义 JSX 工厂和可变元组类型。 

设计


TypeScript 起源于 JavaScript 在 Microsoft 及其外部客户中用于开发大型应用程序的缺点。 [26] 处理复杂 JavaScript 代码的挑战导致了对自定义工具的需求,以简化语言中组件的开发。 

TypeScript 开发人员寻求一种不会破坏与标准及其跨平台支持的兼容性的解决方案。 知道当前的 ECMAScript 标准提案承诺未来支持基于类的编程,TypeScript 就基于该提案。 这导致了一个带有一组语法语言扩展的 JavaScript 编译器,一个基于提案的超集,它将扩展转换为常规 JavaScript。 从这个意义上说,TypeScript 的类特性是对 ECMAScript 2015 的预期的预览。提案中没有但添加到 TypeScript 的一个独特方面是可选的静态类型(也称为渐进类型),它支持静态语言分析以促进 工具和 IDE 支持。

ECMAScript 2015 支持


主条目:ECMAScript § 6th Edition - ECMAScript 2015
TypeScript 添加了对 ECMAScript 2015 标准中定义的类、模块和箭头函数语法等功能的支持。

特征


TypeScript 是一种语言扩展,它为 ECMAScript 6 添加了功能。其他功能包括:

  • 类型注释和编译时类型检查
  • 类型推断
  • 类型擦除
  • 接口
  • 枚举类型
  • 泛型
  • 命名空间
  • 元组
  • 异步/等待

以下功能是从 ECMAScript 2015 向后移植的:

  • 模块
  • 匿名函数的缩写“箭头”语法
  • 可选参数和默认参数

在句法上,TypeScript 与 JScript .NET 非常相似,后者是 ECMA-262 语言标准的另一种 Microsoft 实现,它增加了对静态类型和经典的面向对象语言功能(如类、继承、接口和命名空间)的支持。

与 JavaScript 的兼容性


TypeScript 是 ECMAScript 2015 的严格超集,ECMAScript 2015 本身是 ECMAScript 5 的超集,通常称为 JavaScript。 因此,JavaScript 程序也是有效的 TypeScript 程序,并且 TypeScript 程序可以无缝地使用 JavaScript。 默认情况下,编译器以当前流行的标准 ECMAScript 5 为目标,但也能够生成 ECMAScript 3 或 2015 中使用的结构。

使用 TypeScript,可以使用现有的 JavaScript 代码,合并流行的 JavaScript 库,并从其他 JavaScript 调用 TypeScript 生成的代码。 [30] 这些库的类型声明随源代码一起提供。

类型注解


TypeScript 通过类型注释提供静态类型,以在编译时启用类型检查。 这是可选的,可以忽略以使用 JavaScript 的常规动态类型。

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


基本类型的注释是数字、布尔值和字符串。 Typescript 还支持具有以下注释的数据类型 Array、Enums、void。

其他数据类型有:Tuple、Union、never 和 any。 在每个索引处具有预定义数据类型的数组是元组类型。 保存不止一种类型数据的变量是 Union 类型。 当您确定某事永远不会发生时,您可以使用 never type。 弱类型或动态类型的结构是任何类型。 

可以将类型注释导出到单独的声明文件,以便使用已编译到 JavaScript 中的类型为 TypeScript 脚本提供类型信息。 可以为现有的 JavaScript 库声明注释,就像对 Node.js 和 jQuery 所做的那样。

TypeScript 编译器在未给出类型时使用类型推断来推断类型。 例如,即使没有提供返回类型注释,上面代码中的 add 方法也会被推断为返回一个数字。 这是基于 left 和 right 的静态类型是数字,并且编译器知道两个数字相加的结果始终是一个数字。 但是,显式声明返回类型允许编译器验证正确性。

如果由于缺少声明而无法推断出任何类型,则它默认为动态任意类型。 any 类型的值支持与 JavaScript 中的值相同的操作,并且对任何值的操作执行最少的静态类型检查。 

声明文件


编译 TypeScript 脚本时,可以选择生成一个声明文件(扩展名为 .d.ts),该文件用作已编译 JavaScript 中组件的接口。 在此过程中,编译器剥离所有函数和方法体,仅保留导出类型的签名。 当第三方开发人员从 TypeScript 使用它时,生成的声明文件可用于描述 JavaScript 库或模块的导出虚拟 TypeScript 类型。

声明文件的概念类似于 C/C++ 中的头文件的概念。

declare namespace arithmetics {
    add(left: number, right: number): number;
    subtract(left: number, right: number): number;
    multiply(left: number, right: number): number;
    divide(left: number, right: number): number;
}


可以为现有的 JavaScript 库手动编写类型声明文件,就像 jQuery 和 Node.js 所做的那样。

流行 JavaScript 库的大量声明文件托管在 GitHub 上的 DefinitelyTyped 中。


TypeScript 支持集成可选类型注释支持的 ECMAScript 2015 类。

class Person {
    private name: string;
    private age: number;
    private salary: number;

    constructor(name: string, age: number, salary: number) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    toString(): string {
        return `${this.name} (${this.age}) (${this.salary})`; // As of version 1.4
    }
}

泛型


TypeScript 支持泛型编程。下面是身份函数的一个例子。 [34]

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


联盟类型


本节摘自 Union type § TypeScript。[编辑]
TypeScript 支持联合类型。 这些值被语言隐式地“标记”为类型,并且可以通过“typeof()”检索。

function successor(n: number | bigint): number | bigint {
    return ++n
}


模块和命名空间


TypeScript 区分模块和命名空间。 TypeScript 中的两个特性都支持将类、接口、函数和变量封装到容器中。 命名空间(以前称为内部模块)利用 JavaScript 的立即调用函数表达式来封装代码,而模块(以前称为外部模块)利用 JavaScript 库模式(AMD 或 CommonJS)来封装代码。 

开发工具


编译器


名为 tsc 的 TypeScript 编译器是用 TypeScript 编写的。 因此,它可以被编译成常规的 JavaScript,然后可以在任何 JavaScript 引擎(例如浏览器)中执行。 编译器包捆绑了一个可以执行编译器的脚本宿主。 它也可以作为使用 Node.js 作为主机的 Node.js 包使用。

当前版本的编译器默认支持 ECMAScript 5。 允许一个选项以 ECMAScript 2015 为目标,以使用该版本独有的语言功能(例如生成器)。 尽管类是 ECMAScript 2015 标准的一部分,但在两种模式下都可用。

IDE 和编辑器支持

 

  • Microsoft 为 Visual Studio 2012 和 WebMatrix 提供插件,在 Visual Studio 2013、Visual Studio 2015 中提供全面集成支持,并为 Emacs 和 Vim 提供基本的文本编辑器支持。 
  • Visual Studio Code 是微软基于 Electron 开发的(大部分)开源、跨平台的源代码编辑器。 除了其他几种语言外,它还支持 TypeScript,并提供调试和智能代码完成等功能。
  • alm.tools 是一个用于 TypeScript 的开源云 IDE,使用 TypeScript、ReactJS 和 TypeStyle 构建。
  • JetBrains 在其基于 IntelliJ 平台构建的 IDE(例如 PhpStorm 6、WebStorm 6 和 IntelliJ IDEA)及其 Visual Studio 插件和扩展 ReSharper 8.1中通过代码完成、重构和调试支持 TypeScript。 ]
  • Atom 有一个 TypeScript 插件,支持代码完成、导航、格式化和快速编译。 
  • 在线 Cloud9 IDE 和 Codenvy 支持 TypeScript。
  • NetBeans IDE 有一个插件可用。
  • 一个插件可用于 Eclipse IDE(Kepler 版本)
  • TypEcs 可用于 Eclipse IDE。
  • 跨平台云 IDE Codeanywhere 支持 TypeScript。
  • Webclipse 一个 Eclipse 插件,旨在开发 TypeScript 和 Angular 2。
  • Angular IDE 一个独立的 IDE,可通过 npm 用于开发 TypeScript 和 Angular 2 应用程序,具有集成的终端支持。
  • Tide – Emacs 的 TypeScript 交互式开发环境。


与构建自动化工具集成


使用插件,TypeScript 可以与构建自动化工具集成,包括 Grunt (grunt-ts)、Apache Maven (TypeScript Maven Plugin)、Gulp (gulp-typescript) 和 Gradle (TypeScript Gradle 插件 )。

linting 工具


TSLint扫描 TypeScript 代码是否符合一组标准和指南。 ESLint 是一种标准的 JavaScript linter,它还通过社区插件为 TypeScript 提供了一些支持。 然而,ESLint 无法利用 TypeScript 的语言服务,因此排除了某些形式的语义检查和程序范围的分析。2019 年初,TSLint 团队宣布弃用 linter,转而使用 typescript-eslint,这是 TSLint、ESLint 和 TypeScript 团队的共同努力,旨在将 linting 整合到 ESLint 保护伞下,以提高性能、社区团结和开发人员可访问性。 

 

Tags
 
Article
知识星球
 
微信公众号
 
视频号