You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript运行时如何获取属性装饰器中未赋值属性的定义类型?

解决TypeScript属性装饰器中获取未赋值属性类型的问题

核心问题原因

你无法获取design:type元数据,是因为TypeScript默认不会为类属性的类型信息生成元数据,需要开启特定编译选项并正确引入reflect-metadata。

具体解决步骤

  1. 安装reflect-metadata依赖
    先确保项目中安装了该包:

    npm install reflect-metadata --save
    
  2. 配置TypeScript编译选项
    在tsconfig.json中开启以下关键选项:

    {
      "compilerOptions": {
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "target": "ES5" // 或更高版本,保证兼容reflect-metadata
      }
    }
    

    其中emitDecoratorMetadata是核心,它会让TypeScript为装饰器关联的类、属性生成类型元数据。

  3. 在项目入口引入reflect-metadata
    在项目启动文件(如index.ts)中添加引入语句:

    import 'reflect-metadata';
    

    这一步是读取元数据的前提,缺失则无法获取到生成的类型信息。

  4. 编写装饰器获取属性类型
    现在可以在装饰器中正确获取未赋值属性的声明类型,示例代码:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:17:11