我正在使用一个属性装饰器Field
,它将它的键推送到fields
反射元数据属性:
export function Field(): PropertyDecorator {
return (target, key) => {
const fields = Reflect.getMetadata('fields', target) || [];
if (!fields.includes(key)) {
fields.push(key)
}
Reflect.defineMetadata('fields', fields, target)
}
}
然后,我有一个抽象基类Form
,可以访问 getter 附件中的元数据:
abstract class Form {
get fields() {
return Reflect.getMetadata('fields', this) || [];
}
}
到目前为止,我已经能够成功地使用它来区分表单字段和其他类属性。考虑这些类:
abstract class UserForm extends Form {
@Field()
public firstName: string
@Field()
public lastName: string
get fullName() {
return this.firstName + ' ' + this.lastName;
}
}
class AdminForm extends UserForm {
@Field()
roles: string[]
}
const form = new AdminForm()
console.log(form.fields)
// ['roles', 'firstName', 'lastName']
当我将姐妹类定义为AdminForm
-时,就会出现问题MemberForm
。当存在多个子类时, getterForm
似乎fields
返回所有字段:
class MemberForm extends UserForm {
@Field()
memberSince: Date;
}
const form = new AdminForm()
console.log(form.fields)
// ['roles', 'firstName', 'lastName', 'memberSince'] <--!!!
这对我来说毫无意义。为什么该memberSince
字段出现在 的实例上AdminForm
?如何在不同的子类上定义不同的字段?