文章

TypeScript 5.0 新特性速览

TypeScript 5.0 带来了装饰器标准化、const 类型参数等重要更新,值得每个前端开发者关注。

目录
阅读字号18

概述

TypeScript 5.0 是一个里程碑式的版本。虽然版本号从 4.x 跳到了 5.0,但并没有引入破坏性变更——更多的是功能的成熟和性能的提升。

这篇文章梳理几个我认为最值得关注的新特性。

装饰器标准化

终于,TypeScript 的装饰器和 TC39 Stage 3 提案对齐了。不再需要 experimentalDecorators 标志。

function logged(originalMethod: any, context: ClassMethodDecoratorContext) {
  const methodName = String(context.name);
  function replacementMethod(this: any, ...args: any[]) {
    console.log(`[LOG] ${methodName} called`);
    return originalMethod.call(this, ...args);
  }
  return replacementMethod;
}

class UserService {
  @logged
  getUser(id: string) {
    return { id, name: "yophon" };
  }
}

新装饰器的 context 参数提供了丰富的元信息,包括装饰器的类型(method、field、accessor 等)和名称。

const 类型参数

这是我个人最喜欢的特性。在泛型参数前加 const 修饰符,可以让 TypeScript 推断出更窄的字面量类型:

// 没有 const
function routes<T extends readonly string[]>(paths: T) {
  return paths;
}
const r1 = routes(["home", "about"]); // string[]

// 有 const
function routesConst<const T extends readonly string[]>(paths: T) {
  return paths;
}
const r2 = routesConst(["home", "about"]); // readonly ["home", "about"]

这在构建类型安全的路由、配置对象时特别有用。

枚举增强

所有枚举现在都是联合枚举。这意味着枚举成员可以被用作类型:

enum Color {
  Red = "red",
  Blue = "blue",
}

// 现在可以这样
type RedOnly = Color.Red; // "red"

性能提升

TypeScript 5.0 迁移到了 ES 模块内部结构,带来了显著的性能提升:

  • 包体积减小 50%:从 ~60MB 降到 ~30MB
  • 编译速度提升 10-25%:视项目规模而定
  • 内存占用降低:大型项目尤为明显

--moduleResolution bundler

新增了一个模块解析策略,专门为打包工具(webpack、vite、esbuild)设计:

{
  "compilerOptions": {
    "moduleResolution": "bundler",
    "module": "esnext"
  }
}

它允许你在导入时省略文件扩展名,同时支持 package.json 的 exports 字段——这正是大多数现代前端项目需要的行为。

多个 tsconfig 继承

extends 现在支持数组,可以从多个配置文件继承:

{
  "extends": ["@tsconfig/node18/tsconfig.json", "./tsconfig.paths.json"],
  "compilerOptions": {
    "outDir": "./dist"
  }
}

总结

TypeScript 5.0 的更新方向很明确:

  1. 标准化:装饰器对齐 TC39
  2. 类型推断更强:const 类型参数
  3. 开发体验更好:bundler 模块解析、多继承
  4. 更快更小:性能和包体积双重优化

如果你还在用 4.x,强烈建议升级。迁移成本很低,收益很实在。