Skip to content

TypeScript 装饰器现在以哪一版为准? ​

TypeScript 5 的装饰器跟的是新的标准提案:装饰器接收值和上下文,可以替换方法或登记元数据。experimentalDecorators 仍是旧的一套参数,两套不要在同一个项目里混着讲。

原理 ​

方法装饰器可以包住原方法,在调用前后做日志或鉴权标记。包装时要转发 this 和参数,并保持原方法的返回值,否则实例方法会丢调用者。

类装饰器可以替换构造函数。替换之后,实例的类型仍要和原类兼容,否则使用处的类型是谎的。

装饰器在类定义被求值时执行一次,不是每个实例一次。适合注册路由、标记字段。业务 if 不要藏进装饰器,调用栈会很难读。

旧实验装饰器还会配合 emitDecoratorMetadata 发出设计时类型,那是一些依赖注入库的基础。新装饰器不靠这套元数据。面试先问项目开的是哪个编译选项。

运行时装饰器会留在产物里。这和接口、类型别名不同,那些会被擦掉。

追问 ​

和 Java 注解一样吗?

都是给声明附加信息。TypeScript 的装饰器是真正执行的函数,不是只给编译器看的标记,除非你自己只把信息存进一张表。

参数装饰器呢?

旧提案里有。新提案的能力集中在类、方法、字段和访问器。需要参数级标记时,先确认所用阶段是否支持,不要凭记忆写签名。

易错点 ​

  • 背旧装饰器的三个参数,但项目已经是 TypeScript 5 的新语义。
  • 装饰器里改了方法却不处理异步错误。
  • 多个装饰器叠在一起,却没验证从下到上的包裹顺序。

相关 ​