TypeScript运行时如何获取属性装饰器中未赋值属性的定义类型?
解决TypeScript属性装饰器中获取未赋值属性类型的问题
核心问题原因
你无法获取design:type元数据,是因为TypeScript默认不会为类属性的类型信息生成元数据,需要开启特定编译选项并正确引入reflect-metadata。
具体解决步骤
安装
reflect-metadata依赖
先确保项目中安装了该包:npm install reflect-metadata --save配置TypeScript编译选项
在tsconfig.json中开启以下关键选项:{ "compilerOptions": { "experimentalDecorators": true, "emitDecoratorMetadata": true, "target": "ES5" // 或更高版本,保证兼容reflect-metadata } }其中
emitDecoratorMetadata是核心,它会让TypeScript为装饰器关联的类、属性生成类型元数据。在项目入口引入
reflect-metadata
在项目启动文件(如index.ts)中添加引入语句:import 'reflect-metadata';这一步是读取元数据的前提,缺失则无法获取到生成的类型信息。
编写装饰器获取属性类型
现在可以在装饰器中正确获取未赋值属性的声明类型,示例代码:import 'reflect-metadata'; function PropertyTypeDecorator(target: any, propertyKey: string | symbol) { const propertyType = Reflect.getMetadata('design:type', target, propertyKey); console.log(`属性${String(propertyKey)}的类型为:${propertyType.name}`); // 输出ABC } class ABC {} class Example { @PropertyTypeDecorator abc: ABC; }
注意事项
- 若属性类型为接口(
interface),由于接口在编译后会被完全擦除,无法通过此方式获取,仅能获取类、原始类型等编译后保留的类型。 - 确保装饰器应用顺序和代码执行逻辑正确,避免因执行顺序问题导致元数据丢失。
内容的提问来源于stack exchange,提问作者asdafadsfadsfdaf
相关产品推荐
相关产品推荐

