TypeScript 是由 Microsoft 开发和维护的一种开源编程语言。它是 JavaScript 的一个超集,添加了可选的静态类型、类、接口等特性,旨在提高大型应用开发的效率和可维护性。自 2012 年首次发布以来,TypeScript 社区每月或每季度发布一个新版本,不断引入新的语言特性、编译器优化、工具改进和类型系统增强。理解这些版本特性对于 TypeScript 开发者来说至关重要,它能帮助我们编写更健壮、更现代化且更易于维护的代码。

核心思想: TypeScript 的版本迭代始终围绕着“提升开发者体验、增强类型安全性、更好地支持 JavaScript 新特性、改进工具链”这些目标,旨在弥合 JavaScript 的动态性与大型应用开发对静态分析需求的差距。


一、TypeScript 1.0 - 1.8:早期奠基与核心功能

TypeScript 在早期版本主要关注语言的稳定、核心功能的完善以及与 JavaScript 的兼容性。

1.1 TypeScript 1.0 (2014-04-02)

  • 第一个稳定版本:标志着 TypeScript 正式可以用于生产环境。
  • 核心静态类型系统:变量、函数参数和返回值的类型注解。
    1
    2
    3
    4
    function greet(name: string): string {
    return `Hello, ${name}`;
    }
    let message: string = greet("World");
  • 类 (Classes)接口 (Interfaces)模块 (Modules):支持面向对象编程和模块化开发。
  • 编译到 JavaScript:将 TypeScript 代码编译成纯 JavaScript。
  • 类型定义文件 (.d.ts):允许为现有的 JavaScript 库添加类型信息。

1.2 TypeScript 1.4 (2015-01-20)

  • 联合类型 (Union Types):允许变量可以是多种类型之一。
    1
    2
    let id: number | string = 123;
    id = "abc";
  • letconst 声明:支持 ES6 的块级作用域变量声明。
  • ES6 模块 (Modules):支持 importexport 语法。

1.3 TypeScript 1.5 (2015-07-20)

  • ES6 Decorators (装饰器):实验性支持,用于增强类、方法、属性等。
  • 命名空间 (Namespaces):取代了内部模块,用于组织代码。
  • for...of 循环:支持 ES6 的迭代协议。
  • JSX 支持:开始支持 React 应用中使用的 JSX 语法。
  • 新的模块加载策略umdsystem

1.4 TypeScript 1.6 (2015-09-16)

  • React JSX 支持改进:更强大的 JSX 类型检查。
  • 泛型默认类型参数:为泛型参数提供默认值。
    1
    2
    3
    4
    function createArray<T = string>(length: number, value: T): T[] {
    return Array(length).fill(value);
    }
    let strs = createArray(3, "hello"); // T 默认为 string

1.5 TypeScript 1.7 (2015-11-30)

  • async / await 支持 (ES6 Target):在编译到 ES6 时支持异步函数。
  • 多态 this 类型:允许方法返回派生类的实例类型。

1.6 TypeScript 1.8 (2016-02-23)

  • F-Bounded 多态类型:支持更复杂的继承关系。
  • 字符串字面量类型 (String Literal Types):限制字符串变量只能取特定字符串值。
    1
    2
    type Direction = "north" | "south" | "east" | "west";
    let d: Direction = "north";
  • 控制流分析改进:更智能地推断类型。
  • 对 React 和 JSX 的更多改进

二、TypeScript 2.0 - 2.x:Nullable Types 与更强大的类型系统

TypeScript 2.0 引入了空值安全,这是类型系统的一大进步,此后版本持续在类型推断和安全性上发力。

2.1 TypeScript 2.0 (2016-09-22)

  • 空值和未定义检查 (--strictNullChecks)
    • nullundefined 不再是所有类型的子类型,必须显式声明为联合类型。
    • 显著减少运行时空指针异常。
    1
    2
    let s: string = null; // Error with --strictNullChecks
    let s2: string | null = null; // OK
  • 非空断言运算符 (!):告诉编译器变量不是 nullundefined
    1
    2
    3
    function foo(x: string | null) {
    console.log(x!.length); // 告诉编译器 x 不是 null
    }
  • never 类型:表示永远不会发生的类型,用于穷举检查。
  • readonly 属性修饰符:使类属性或接口属性只读。
  • this 类型推断改进
  • @types 支持:通过 npm install @types/packagename 获取类型定义。

2.2 TypeScript 2.1 (2016-11-08)

  • keyof 和查找类型 (Indexed Access Types)
    • keyof T:获取类型 T 的所有公共属性名(字符串字面量联合类型)。
    • T[K]:查找类型,根据键 K 获取类型 T 中的属性类型。
    1
    2
    3
    interface Person { name: string; age: number; }
    type PKeys = keyof Person; // "name" | "age"
    type NameType = Person['name']; // string
  • 映射类型 (Mapped Types):基于现有类型创建新类型。
    1
    2
    3
    4
    5
    6
    type Readonly<T> = {
    readonly [P in keyof T]: T[P];
    };
    type Partial<T> = {
    [P in keyof T]?: T[P];
    };
  • 隐式 any 错误 (--noImplicitAny) 改进
  • async / await 支持 (ES3/ES5 Target):通过 Promise polyfill 实现。

2.3 TypeScript 2.2 (2017-02-27)

  • object 类型:表示非原始类型(非 number, string, boolean, symbol, null, undefined)。
  • --jsx flag 改进
  • 支持 new.target (ES6)

2.4 TypeScript 2.3 (2017-04-27)

  • --strict 标志:组合了所有严格检查选项(如 strictNullChecks, noImplicitAny, noImplicitThis 等)。
  • 泛型参数的默认值
  • 生成器函数改进

2.5 TypeScript 2.4 (2017-07-27)

  • 字符串字面量泛型:在泛型中支持字符串字面量类型。
  • 回调函数参数严格检查:对回调函数的参数类型进行更严格的检查。
  • 弱类型检测:对所有属性都是可选的类型进行特殊处理。

2.6 TypeScript 2.5 (2017-08-31)

  • 可选捕获参数try...catch 语句中的 catch 块可以省略参数。
  • JSX 改进
  • checkJs (JavaScript 类型检查):允许在 JavaScript 文件中使用 JSDoc 进行类型检查。

2.7 TypeScript 2.6 (2017-10-31)

  • --strictFunctionTypes:对函数参数进行协变检查(更严格)。
  • 上下文类型推断改进

2.8 TypeScript 2.7 (2018-01-31)

  • 固定属性检查 (Fixed Property Checking):对对象字面量进行更严格的属性检查。
  • --esModuleInterop:改善了 CommonJS 和 ES 模块之间的互操作性。
  • 数字字面量分隔符:支持 1_000_000 这样的数字表示。

2.9 TypeScript 2.8 (2018-03-27)

  • 条件类型 (Conditional Types):根据条件选择不同的类型。
    • T extends U ? X : Y
    1
    2
    type NonNullable<T> = T extends null | undefined ? never : T;
    type T1 = NonNullable<string | null>; // string
  • 预定义条件类型 (Predefined Conditional Types)Exclude, Extract, NonNullable, ReturnType, InstanceType
    • ReturnType<T>:获取函数类型 T 的返回类型。
    1
    2
    function foo(): number { return 1; }
    type FooReturn = ReturnType<typeof foo>; // number
  • 映射类型中 infer 关键字:用于在条件类型中推断类型。

三、TypeScript 3.0 - 3.x:Project References 与新语法糖

TypeScript 3.x 系列重点关注大型项目的可伸缩性、新的语法特性和类型系统的实用性。

3.1 TypeScript 3.0 (2018-07-30)

  • Project References (项目引用):允许将大型 TypeScript 项目拆分为更小的子项目,提高编译速度和管理性。
  • 元组类型中剩余元素 (... 语法)
    1
    type Foo = [number, ...string[]]; // [number, string, string, ...]
  • unknown 类型:比 any 更安全,必须进行类型断言或缩小才能使用。
    1
    2
    3
    4
    5
    function process(x: unknown) {
    if (typeof x === 'string') {
    console.log(x.length); // x 现在是 string
    }
    }
  • 声明文件中的默认导入支持

3.2 TypeScript 3.1 (2018-09-27)

  • 映射类型和元组/数组:映射类型可以作用于元组和数组。
  • 属性在函数上断言 (Property Assignments on Functions):支持函数声明时直接赋值属性。

3.3 TypeScript 3.2 (2018-11-29)

  • Object.entriesObject.fromEntries 类型改进
  • strictBindCallApply 标志:对 call, apply, bind 方法进行更严格的类型检查。
  • 泛型展开语法 (Generic Spread Expressions):改进了对象和数组展开运算符的类型推断。

3.4 TypeScript 3.3 (2019-01-31)

  • --build 模式下的增量编译:大幅提升项目引用下的编译速度。
  • yield* 的类型检查改进

3.5 TypeScript 3.4 (2019-03-28)

  • readonly 元组readonly [string, number]
  • const 断言:将变量或表达式标记为 const,使其类型变为最窄的字面量类型。
    1
    let x = [1, 2] as const; // type is readonly [1, 2]
  • 类型推断改进:包括高阶函数。

3.6 TypeScript 3.7 (2019-11-05)

  • 可选链 (Optional Chaining):访问可能为 nullundefined 的属性或方法。
    • a?.b (属性)
    • a?.() (方法)
    • a?.[b] (索引)
    1
    2
    3
    4
    5
    6
    7
    8
    interface User {
    name: string;
    address?: {
    street: string;
    };
    }
    let user: User = { name: "Alice" };
    console.log(user.address?.street); // undefined
  • 空值合并运算符 (Nullish Coalescing)?? 运算符,当左侧为 nullundefined 时返回右侧。
    1
    let foo = someValue ?? "default"; // 如果 someValue 是 null/undefined,则 foo 为 "default"
  • 断言函数 (Assertion Functions):用于告诉编译器在函数返回后,某些变量的类型被断言为特定类型。
    1
    2
    3
    4
    5
    6
    7
    8
    function assertIsString(val: any): asserts val is string {
    if (typeof val !== 'string') {
    throw new Error("Not a string!");
    }
    }
    let x: any = "hello";
    assertIsString(x);
    console.log(x.length); // x 现在被推断为 string
  • 递归类型别名改进

3.7 TypeScript 3.8 (2020-02-20)

  • type 导入/导出:允许显式地只导入/导出类型,避免运行时开销。
    • import type { Foo } from "./bar";
  • ES 模块私有字段 (#):支持 ES2020 的私有类字段。
  • export * as ns 语法
    • export * as utils from "./utils";
  • Top-level await (ES Modules)
  • JSDoc 属性推断改进

3.8 TypeScript 3.9 (2020-05-12)

  • 性能改进:编译器性能提升,特别是对大型代码库。
  • 类型推断改进:特别是对 Promise 和 Array.prototype.flat 的推断。

四、TypeScript 4.0 - 4.x:元组类型改进与模板字面量

TypeScript 4.x 系列继续在类型系统的高级功能和工具链的易用性上发力,引入了更强大的元组类型和模板字面量类型。

4.1 TypeScript 4.0 (2020-08-20)

  • 可变参数元组类型 (Variadic Tuple Types):允许在元组类型中使用剩余参数,结合泛型实现更灵活的函数签名。
    1
    2
    3
    4
    5
    type Arr = [string, number, ...boolean[]];
    function concat<T extends unknown[], U extends unknown[]>(arr1: T, arr2: U): [...T, ...U] {
    return [...arr1, ...arr2];
    }
    const result = concat(["hello"], [10, true]); // ["hello", 10, true]
  • Labeled Tuple Elements (带有标签的元组元素):为元组中的元素添加名称,提高可读性,但不会影响类型。
    1
    type Person = [name: string, age: number];
  • --noPropertyAccessFromIndexSignature:更严格地检查通过索引签名访问属性。
  • IDE 方面的改进:更智能的自动完成和重构。

4.2 TypeScript 4.1 (2020-11-19)

  • 模板字面量类型 (Template Literal Types):允许在类型系统中使用模板字符串,创建基于字符串内容的类型。
    1
    2
    type EventName<T extends string> = `${T}Changed` | `${T}Deleted`;
    type UserEvents = EventName<"user">; // "userChanged" | "userDeleted"
  • 递归条件类型:条件类型现在支持一定程度的递归。
  • 键重映射 (Key Remapping) in Mapped Types:允许在映射类型中重命名属性键。
    1
    2
    3
    type Getters<T> = {
    [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K]
    };
  • infer 的更深入支持

4.3 TypeScript 4.2 (2021-02-23)

  • 抽象构造签名 (Abstract Construct Signatures):允许在接口中定义抽象类的构造函数签名。
  • 性能改进:对大型代码库的类型检查速度提升。

4.4 TypeScript 4.3 (2021-05-26)

  • override 关键字:显式标记子类方法覆盖父类方法。
  • static:ES2022 的静态初始化块支持。
  • setter / getterstring / symbol 索引签名支持

4.5 TypeScript 4.4 (2021-08-26)

  • 控制流分析增强:更智能地处理别名和条件。
  • symbol 和模板字面量类型作为索引签名
  • --exactOptionalPropertyTypes:更严格地检查可选属性,区分 undefined 和不存在的属性。

4.6 TypeScript 4.5 (2021-11-17)

  • Awaited 类型:模拟 await 关键字对 Promise 类型的解包行为。
    1
    2
    type P = Promise<Promise<number>>;
    type Result = Awaited<P>; // number
  • module es2022 模块解析
  • import 断言 (Import Assertions):ES2022 提案,为 import 语句添加元数据。
  • 私有字段检查:对私有字段 (#) 的检查改进。

4.7 TypeScript 4.6 (2022-02-24)

  • 控制流分析对解构赋值的支持
  • 更好的递归类型别名检查
  • 性能改进:对 tslib 和 IDE 响应速度的优化。

4.8 TypeScript 4.7 (2022-05-24)

  • ESM 模块支持改进 (Node.js):增加了对 moduleResolution: "node16""nodenext" 的支持,以更好地处理 ESM。
  • 实例化表达式 (Instantiation Expressions):允许对泛型函数进行部分类型应用。
    1
    const makeBox = Box<string>; // 等同于 (x: string) => Box<string>
  • extends 约束中的 infer 关键字
  • Object 类型的改进

4.9 TypeScript 4.8 (2022-08-25)

  • 改进的交叉类型推断:在某些情况下,交叉类型推断会更智能。
  • 文件监视改进:在文件系统变更时,更高效地重新编译。
  • 性能提升

4.10 TypeScript 4.9 (2022-11-15)

  • satisfies 运算符:允许在不影响原始类型推断的情况下,验证表达式是否满足某个类型。
    1
    2
    3
    4
    5
    6
    7
    type Colors = "red" | "green" | "blue";
    const palette = {
    red: [255, 0, 0],
    green: "#00FF00",
    blue: [0, 0, 255]
    } satisfies Record<Colors, string | number[]>;
    // palette.red 的类型仍是 number[], 不会被拓宽为 string | number[]
  • in 运算符的类型缩小改进:在 if (key in obj) 中,obj 的类型可以更好地被缩小。
  • typeof 运算符的类型缩小改进
  • --exactOptionalPropertyTypes 成为默认

五、TypeScript 5.0 - 最新稳定版:装饰器 V2 与更强大的模块系统

TypeScript 5.x 系列是 TypeScript 发展的重要阶段,聚焦于标准化新的 ECMAScript 提案、提升编译性能和进一步增强类型系统。

5.1 TypeScript 5.0 (2023-03-16)

  • ECMAScript Decorators (装饰器):支持 TC39 Stage 3 的装饰器提案,并兼容旧版装饰器。这是核心语言特性的一大升级。
    1
    2
    3
    4
    @logMethod
    class MyClass {
    myMethod() { /* ... */ }
    }
  • 新的模块解析策略 (--moduleResolution bundler):旨在更好地与现代打包工具 (如 Webpack, Vite) 协同工作,简化配置。
  • 新的 JSDoc 语法:支持 JSDoc 中的 @satisfies
  • 枚举类型 (Enums) 的联合类型:可以将枚举视为字面量联合类型,提高兼容性。
  • 性能改进:编译速度显著提升,尤其是大型项目。

5.2 TypeScript 5.1 (2023-05-24)

  • getter 和 setter 属性的独立类型:现在可以为 getter 和 setter 定义不同的类型,这对于只读属性或计算属性非常有用。
  • JSX 标签中更宽松的类型声明
  • void 返回类型推断改进

5.3 TypeScript 5.2 (2023-08-24)

  • 使用 using 声明 (ECMAScript Explicit Resource Management):支持 TC39 Stage 3 的 using 声明,用于自动管理资源。
    1
    2
    3
    4
    function doSomething() {
    using file = openFile("path/to/file");
    // file 会在函数结束时自动关闭
    }
  • --declaration--emitDeclarationOnly 改进:在生成声明文件时更加灵活。
  • 命名空间和类型别名的改进

5.4 TypeScript 5.3 (2023-11-16)

  • import type 语句的改进:现在可以在 import 语句中使用 type 关键字,以确保导入的是类型而不是值。
  • resolution-mode 类型导入属性:在单个导入中使用不同的模块解析策略。
  • switch (true) 的类型缩小:更智能地缩小 switch (true) 语句中的类型。
  • --compilerOptions 参数改进

5.5 TypeScript 5.4 (最新稳定版,2024-03-01)

  • Object.groupByMap.groupBy 类型支持 (ECMAScript Stage 3):为这些新的数组分组方法提供类型定义。
  • 改进了闭包中类型变量的类型检查
  • --module no-cjs-exports 选项:强制 CommonJS 模块不能有命名导出。
  • 性能和稳定性改进

5.6 TypeScript 5.x 展望 (未来版本,例如 5.5+)

TypeScript 的发展是一个持续的过程,我们可以期待未来版本在以下方面继续推进:

  • 新的 ECMAScript 提案支持:紧跟 TC39 提案的进展,如 Records and Tuples、Pattern Matching 等,逐步在 TypeScript 中提供支持。
  • 编译器性能优化:持续提升类型检查和编译的速度,尤其是在大型 monorepo 项目中。
  • 更强大的类型推断:减少手动类型注解的需求,让 TypeScript 更智能地理解代码意图。
  • 工具链和 IDE 体验改进:提供更强大的代码补全、重构和错误提示。
  • d.ts 文件生成改进:使类型定义文件的生成更加精确和灵活。
  • 更细粒度的控制流分析

六、总结

TypeScript 从最初的类型注解和面向对象支持,逐步发展到拥有强大的空值安全、高级类型操作(如条件类型、映射类型、模板字面量类型)、现代 JavaScript 特性支持(如可选链、空值合并)、以及对大型项目和模块化开发的全面支持。每个版本的发布都旨在让 JavaScript 生态系统更加健壮、可维护,并为开发者提供更愉悦的开发体验。持续学习和掌握 TypeScript 的新特性,是现代前端和后端(Node.js)开发者提升专业能力的关键。