本文将详细介绍 TypeScript 自 5.0 版本以来的重要更新,帮助开发者了解并应用这些新特性来提升开发效率和代码质量。
📅 TypeScript 5.0 (2023年3月)
1. 装饰器(Decorators)正式支持
TypeScript 5.0 正式支持了 ECMAScript Stage 3 的装饰器提案,这是一个里程碑式的更新。
typescript
// 类装饰器
function logged(value: any, context: ClassDecoratorContext) {
return class extends value {
constructor(...args: any[]) {
super(...args);
console.log(`创建了 ${context.name} 的实例`);
}
};
}
@logged
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
// 方法装饰器
function log(target: any, context: ClassMethodDecoratorContext) {
const methodName = String(context.name);
return function (this: any, ...args: any[]) {
console.log(`调用方法: ${methodName}`);
return target.apply(this, args);
};
}
class Calculator {
@log
add(a: number, b: number) {
return a + b;
}
}
2. const 类型参数
允许在泛型中使用 const 修饰符,锁定类型为字面量类型。
csharp
// 不使用 const
function makeArray<T>(arr: T[]) {
return arr;
}
const arr1 = makeArray([1, 2, 3]); // number[]
// 使用 const
function makeConstArray<const T>(arr: T[]) {
return arr;
}
const arr2 = makeConstArray([1, 2, 3]); // readonly [1, 2, 3]
3. 枚举改进
所有枚举成员现在都可以作为联合枚举使用。
javascript
enum Status {
Loading = "loading",
Success = "success",
Error = "error"
}
// 可以直接用作类型
function handleStatus(status: Status) {
switch (status) {
case Status.Loading:
return "加载中...";
case Status.Success:
return "成功!";
case Status.Error:
return "错误!";
}
}
📅 TypeScript 5.1 (2023年6月)
1. get/set 访问器类型解耦
允许 getter 和 setter 使用不同的类型,提供更灵活的 API 设计。
arduino
class Thing {
#size = 0;
// getter 返回 number
get size(): number {
return this.#size;
}
// setter 可以接受 number | string
set size(value: number | string) {
this.#size = typeof value === 'string' ? parseInt(value) : value;
}
}
const thing = new Thing();
thing.size = "42"; // ✅ 可以传字符串
console.log(thing.size); // 42 (number)
2. 未定义返回函数的改进
更好地处理返回 undefined 的函数。
javascript
// 之前可能需要显式返回 undefined
function doSomething(): undefined {
console.log("做点什么");
return undefined;
}
// 现在可以省略 return
function doSomethingElse(): undefined {
console.log("做点别的");
// 不需要显式 return
}
📅 TypeScript 5.2 (2023年8月)
1. using 声明和显式资源管理
支持 ECMAScript 的显式资源管理提案,自动清理资源。
typescript
// 实现 Disposable 接口
class FileHandle implements Disposable {
private file: string;
constructor(filename: string) {
this.file = filename;
console.log(`打开文件: ${filename}`);
}
[Symbol.dispose]() {
console.log(`关闭文件: ${this.file}`);
// 清理资源
}
read() {
return `读取 ${this.file} 的内容`;
}
}
// 使用 using 声明
function processFile() {
using file = new FileHandle("data.txt");
console.log(file.read());
// 函数结束时自动调用 [Symbol.dispose]
}
2. 装饰器元数据
增强装饰器功能,支持元数据反射。
typescript
function setMetadata(key: string, value: any) {
return (target: any, context: DecoratorContext) => {
context.metadata[key] = value;
};
}
@setMetadata("version", "1.0")
class MyClass {}
📅 TypeScript 5.3 (2023年11月)
1. Import Attributes 支持
支持导入断言的标准化语法。
javascript
// 导入 JSON 文件
import data from "./data.json" with { type: "json" };
// 导入 CSS 模块
import styles from "./styles.css" with { type: "css" };
2. switch(true) 收窄
改进 switch(true) 语句中的类型收窄。
typescript
function processValue(value: string | number) {
switch (true) {
case typeof value === "string":
// value 被收窄为 string
return value.toUpperCase();
case typeof value === "number":
// value 被收窄为 number
return value.toFixed(2);
}
}
📅 TypeScript 5.4 (2024年3月)
1. NoInfer 工具类型
防止类型推断在特定位置发生,提供更精确的类型控制。
ini
function createMap<T>(
keys: T[],
defaultValue: NoInfer<T>
): Map<T, T> {
const map = new Map<T, T>();
keys.forEach(key => map.set(key, defaultValue));
return map;
}
// T 只从 keys 推断,不从 defaultValue 推断
const map1 = createMap(["a", "b"], "default"); // Map<string, string>
const map2 = createMap([1, 2], 0); // Map<number, number>
2. Object.groupBy 和 Map.groupBy 支持
支持新的 JavaScript 分组方法。
yaml
const people = [
{ name: "Alice", age: 25 },
{ name: "Bob", age: 30 },
{ name: "Charlie", age: 25 }
];
const grouped = Object.groupBy(people, person => person.age);
// { 25: [{name: "Alice", age: 25}, {name: "Charlie", age: 25}],
// 30: [{name: "Bob", age: 30}] }
📅 TypeScript 5.5 (2024年6月)
1. 推断类型谓词(Inferred Type Predicates)
自动推断函数是否为类型守卫,无需手动编写类型谓词。
typescript
// 之前需要显式声明类型谓词
function isString(value: unknown): value is string {
return typeof value === "string";
}
// 现在 TypeScript 可以自动推断
function isStringAuto(value: unknown) {
return typeof value === "string";
}
const values: unknown[] = ["hello", 42, "world"];
// TypeScript 能识别 filter 后的类型
const strings = values.filter(isStringAuto); // string[]
2. 常量索引访问的控制流收窄
改进对常量索引访问的类型分析。
vbnet
function processData(data: { status: "success"; value: number } | { status: "error"; error: string }) {
const key = "status" as const;
if (data[key] === "success") {
// data 被正确收窄为 { status: "success"; value: number }
console.log(data.value);
} else {
// data 被正确收窄为 { status: "error"; error: string }
console.log(data.error);
}
}
3. 正则表达式语法检查
在字符串字面量中检查正则表达式语法错误。
arduino
// ❌ 编译时报错:无效的正则表达式
const invalidRegex = /[/;
// ✅ 正确的正则表达式
const validRegex = /[/;
4. 数组过滤增强
更智能的数组 filter 方法类型推断。
typescript
const mixed: (string | number | null)[] = ["hello", 42, null, "world", null];
// 自动推断过滤后的类型
const nonNull = mixed.filter(x => x !== null); // (string | number)[]
const strings = mixed.filter(x => typeof x === "string"); // string[]
📅 TypeScript 5.6 (2024年9月)
1. 可变元组支持
增强的元组类型功能,支持更灵活的元组操作。
scala
// 可变元组类型
type Prefixed<T extends unknown[]> = [string, ...T];
type Example1 = Prefixed<[number, boolean]>; // [string, number, boolean]
type Example2 = Prefixed<[]>; // [string]
📅 TypeScript 5.7 (2024年11月)
1. ES2024 特性集成
完整支持最新的 ECMAScript 2024 特性。
typescript
// 支持 Promise.withResolvers
const { promise, resolve, reject } = Promise.withResolvers<number>();
// 支持 Array.fromAsync
const asyncIterable = async function* () {
yield 1;
yield 2;
yield 3;
};
const array = await Array.fromAsync(asyncIterable());
2. 模块解析改进
更好的路径重写和模块解析能力。
json
// tsconfig.json
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"],
"@components/*": ["./src/components/*"]
}
}
}
📅 TypeScript 5.8 (2025年3月)
1. 返回表达式中的分支类型检查增强
改进对返回语句中条件表达式的类型检查。
typescript
function getValue(condition: boolean): string | number {
// TypeScript 5.8 更精确地推断返回类型
return condition
? "string value" // string
: 42; // number
}
2. 稳定的 --module node18 标志
为 Node.js 18+ 用户提供稳定的模块系统支持。
json
// tsconfig.json
{
"compilerOptions": {
"module": "node18",
"moduleResolution": "node18"
}
}
3. 直接执行支持
简化 TypeScript 代码的直接执行流程,提升开发体验。
🎯 总结
TypeScript 5.x 系列版本带来了众多重要特性:
🔑 核心亮点
- 装饰器标准化 - 正式支持 ECMAScript 装饰器
- 资源管理 -
using声明自动清理资源 - 类型推断增强 - 自动推断类型守卫、更好的控制流分析
- 开发体验 - 正则语法检查、更好的错误提示
- ECMAScript 对齐 - 紧跟最新 JavaScript 标准
📊 升级建议
- 从 4.x 升级到 5.x: 强烈推荐,性能和类型安全性大幅提升
- 渐进式采用: 新特性可以逐步引入,不会破坏现有代码
- 关注装饰器: 如果使用旧版装饰器,需要迁移到新语法
🔗 参考资源
你最喜欢哪个新特性?欢迎在评论区讨论! 💬