Я использую декоратор свойства Field
, который помещает свой ключ в свойство метаданных fields
Reflect:
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
, который обращается кметаданные в дополнительном модуле получения:
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
.Когда существует несколько подклассов для Form
, кажется, что fields
getter возвращает все поля:
class MemberForm extends UserForm {
@Field()
memberSince: Date;
}
const form = new AdminForm()
console.log(form.fields)
// ['roles', 'firstName', 'lastName', 'memberSince'] <--!!!
Это не имеет смысла для меня.Почему поле memberSince
появляется в экземпляре AdminForm
?Как я могу определить разные поля на разных подклассах?