Reflect.getMetadata返回undefined:TypeScript装饰器获取类型失败求助
问题背景
我正在使用新的实验性装饰器,它能提升开发体验,避免为特定功能单独创建配置文件。我的需求是仅通过属性名确定属性的TypeScript类型,从而根据类型条件渲染输入组件。
尝试方案
我参考了相关资料编写了装饰器函数:
export const createTrailerPropertySaveDataType = (instance: any, propertyName: string) => { var rawType = Reflect.getMetadata('design:type', instance, propertyName); console.log('RAW TYPE'); console.log(rawType); console.log('TYPE OF RAW TYPE'); console.log(typeof rawType); // propertyNameToDataType[propertyName] = ; // console.log('CREATE Categorization Test'); };
并在类属性上使用该装饰器:
@createTrailerPropertySaveDataType vin: string;
遇到的问题
调试发现执行Reflect.getMetadata后返回undefined。另外发现一个奇怪现象:只有调用类中的静态方法(如下方的init方法)时,装饰器才会生效,移除该方法则装饰器不触发。
static init() { return 0; }
我已在编译器选项中开启emitDecoratorMetadata和experimentalDecorators。
排查情况
我查阅了多个相关资源,但未找到解决方案:
- Stack Overflow某问题的解决方案针对未装饰成员,不适用我的场景;
- GitHub某Issue的问题原因是类型定义在类之后,而我的属性类型是string,不涉及该问题;
- Stack Overflow另一问题暂无解决办法。
更新进展
我发现GitHub某Issue指出,在特定版本的create-react-app中使用TypeScript的emitMetadata时会失效,因为Babel不支持emitMetadata标签。我将尝试该Issue中的解决方法并反馈结果。
因涉及工作代码无法共享完整仓库,可提供相关代码片段,求解决方案。
内容的提问来源于stack exchange,提问作者Shawn Whitaker
相关产品推荐
相关产品推荐

