TypeScript в 2025 году: что нового?
2025 год стал знаковым для экосистемы TypeScript. После выхода версий 5.5 и 5.6, а также анонсов, касающихся будущих релизов, язык получил ряд важных улучшений, которые делают разработку еще более безопасной, производительной и удобной. В этой статье мы разберем ключевые нововведения TypeScript в 2025 году, которые должен знать каждый разработчик, работающий с этим языком.
1. 隔离声明 (Isolated Declarations)
2025年最重要的创新之一就是隔离声明(isolated declarations)功能的稳定。这个特性首次出现在 TypeScript 5.5 中,从根本上改变了声明文件(.d.ts)的生成方式。
以前,TypeScript 编译器为了生成 .d.ts 文件,需要分析整个模块的依赖关系图。这对于现代构建工具(例如 esbuild、swc)来说既缓慢又复杂,因为这些工具是独立处理每个文件的。
isolatedDeclarations 特性强制开发者显式指定导出函数、变量和类的类型。这样一来,工具无需完整分析代码即可生成声明,从而显著加快构建速度。
它是如何工作的?
在 tsconfig.json 中启用该选项:
{ "compilerOptions": { "isolatedDeclarations": true, "declaration": true }}现在,编写代码时必须显式注释导出实体的类型:
// ❌ 错误:导出的变量没有显式类型export const data = fetchData();
// ✅ 正确export const data: DataType = fetchData();
// ❌ 错误:参数没有类型注释export function process(input) { ... }
// ✅ 正确export function process(input: InputType): OutputType { ... }为什么这很重要? 这不仅加快了构建速度,还使代码更加文档化和易于理解。开发者不能再依赖公共 API 的隐式类型推断,从而提高了代码的可靠性。
2. 改进了解构赋值的流程控制
TypeScript 5.6 带来了期待已久的改进:对对象解构的流程控制分析(control flow analysis)进行了增强。以前,TypeScript 在解构时会“丢失”类型信息,导致需要编写多余的检查。
看一个例子:
type User = { name: string; email?: string; role: "admin" | "user";};
function greet(user: User) { const { name, email, role } = user;
// 在 TypeScript 5.5 及更早版本中:错误!Object is possibly 'undefined' // 在 TypeScript 5.6 及更新版本中:一切正常 if (email) { console.log(`Email: ${email.toUpperCase()}`); }
// 对可辨识联合的智能类型收窄 if (role === "admin") { console.log(`Admin ${name} logged in`); }}现在,TypeScript 会保留解构变量与原始对象之间的关联。这在处理可辨识联合(discriminated unions)和可选字段时尤其有用。
3. 新的语法功能和装饰器
2025 年也标志着装饰器的完全稳定(Stage 3 的装饰器已成为 ECMAScript 标准的一部分)。TypeScript 完全支持新的装饰器语法,这与旧的实验性语法不同。
新装饰器使用示例:
// 类装饰器的新语法function logMethod<T, A extends any[], R>( target: (this: T, ...args: A) => R, context: ClassMethodDecoratorContext) { return function (this: T, ...args: A): R { console.log(`Calling ${String(context.name)} with args:`, args); return target.call(this, ...args); };}
class Calculator { @logMethod add(a: number, b: number): number { return a + b; }}
const calc = new Calculator();calc.add(2, 3); // 控制台输出:Calling add with args: [2, 3]