概述
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 的更新方向很明确:
- 标准化:装饰器对齐 TC39
- 类型推断更强:const 类型参数
- 开发体验更好:bundler 模块解析、多继承
- 更快更小:性能和包体积双重优化
如果你还在用 4.x,强烈建议升级。迁移成本很低,收益很实在。