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

如何获取类中带有自定义@Id装饰器的字段列表?

获取带有@Id装饰器的类字段列表的方法

嘿,这个场景我太熟了!在TypeScript里要提取类中被@Id标记的字段,核心思路是在装饰器执行时把字段信息存起来,之后再通过类本身去读取这些存储的信息。下面给你一步步讲清楚怎么做:

1. 改造@Id装饰器,添加字段记录逻辑

装饰器会在类被加载的时候自动执行,所以我们可以利用这个时机,把被标记的字段名存储到类的构造函数上。修改后的装饰器代码如下:

export function Id(target: any, key: string) {
  // target是类的原型,target.constructor才是类的构造函数本身
  const classConstructor = target.constructor;
  
  // 初始化存储字段的数组(如果还没创建的话)
  if (!classConstructor.__idFields__) {
    classConstructor.__idFields__ = [];
  }
  
  // 将当前被装饰的字段名加入数组
  classConstructor.__idFields__.push(key);
}

2. 读取带@Id装饰的字段列表

当你给类字段加上@Id后,直接通过类的构造函数就能拿到所有标记过的字段:

class Test { 
  @Id public id: number; 
  @Id public userId: number;
  public name: string; // 这个字段没有@Id,不会被记录
}

// 获取所有带@Id的字段
const idFields = Test.__idFields__;
console.log(idFields); // 输出: ["id", "userId"]

如果是从类的实例中获取,也可以通过实例的constructor属性访问:

const testInstance = new Test();
const instanceIdFields = testInstance.constructor.__idFields__;

3. 进阶:用Symbol避免属性名冲突

上面的__idFields__是自定义的属性名,万一和类的其他属性重名就麻烦了。更安全的做法是用Symbol作为存储的键,因为Symbol是唯一的:

// 定义一个唯一的Symbol键
const ID_FIELDS_KEY = Symbol('id-fields');

export function Id(target: any, key: string) {
  const classConstructor = target.constructor;
  
  if (!classConstructor[ID_FIELDS_KEY]) {
    classConstructor[ID_FIELDS_KEY] = [];
  }
  
  classConstructor[ID_FIELDS_KEY].push(key);
}

// 获取字段时用这个Symbol键
const idFields = Test[ID_FIELDS_KEY];

注意事项

别忘了在你的tsconfig.json里启用装饰器支持,否则装饰器不会生效:

{
  "compilerOptions": {
    "experimentalDecorators": true,
    // 其他配置...
  }
}

内容的提问来源于stack exchange,提问作者Visarut Sae-Pueng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:16