TypeScript 5.0.2中emitDecoratorMetadata需experimentalDecorators才能生效问题
为什么TypeScript 5的新装饰器无法在不开启
experimentalDecorators时使用emitDecoratorMetadata? 问题描述
我在TypeScript 5中尝试使用新装饰器特性,需要通过装饰器元数据获取运行时类型。已经在tsconfig里配置了emitDecoratorMetadata,但发现不开启experimentalDecorators的话这个配置根本不生效。我原本以为不用开experimentalDecorators,只用新装饰器语法就能拿到运行时类型,想知道这是为什么?
回答
核心原因
TypeScript的emitDecoratorMetadata配置目前仅兼容旧版实验性装饰器,和新的标准装饰器语法完全不兼容:
- 旧版装饰器是TypeScript早年推出的实验性特性,
emitDecoratorMetadata是专门为它设计的编译选项,作用是在编译阶段自动为装饰过的类、属性等注入类型元数据,让你能通过Reflect.getMetadata这类API获取运行时类型信息。 - 新的标准装饰器基于ES官方提案实现,它的执行机制、装饰逻辑和旧版实验性装饰器差异极大。截至目前,TypeScript团队还没有为标准装饰器实现自动元数据注入的功能——所以只要你没开启
experimentalDecorators,哪怕配置了emitDecoratorMetadata,编译器也不会生成任何元数据相关的代码。
临时解决方案
如果需要在新装饰器中获取运行时类型,目前只能手动编写元数据注入逻辑,或者等待TypeScript后续版本为标准装饰器添加元数据支持。
内容的提问来源于stack exchange,提问作者Dudă
相关产品推荐
相关产品推荐

