如何获取类中带有自定义@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
相关产品推荐
相关产品推荐

