Я пытаюсь построить модель в TypeScript, которая использует декораторы, используемые в качестве аннотации данных, для выполнения некоторой проверки данных. В основном, со следующим cnde:
function IsString(target: any, propertyKey: string | symbol, descriptor?: PropertyDescriptor) : any {
// NOTE: This should be called each time the property is set.
}
class Person {
@IsString
name : string = '';
@IsString
surname : string = '';
constructor(name: string, surname: string) {
this.name = name;
this.surname = surname;
}
}
let foo = new Person('pippo','pluto');
foo.name = 'paperino'; // Validation should run, and be OK
foo.name = 7; // Validation should run, and somehow warn me
Я хотел бы запускать проверку IsString
каждый раз, когда я устанавливаю свойства name
и surname
.
Я пробовал разные вещикак, например, использование прокси для перехвата set
каждого свойства, но тогда я понятия не имею, как я могу запустить другой декоратор. Позвольте мне снова показать вам:
const PersonProxied = (name, surname, classGenerator: { new(name, surname): any }) => new Proxy(new classGenerator(name, surname), validator);
let validator = {
set: function(obj: any, prop: any, value: any) {
console.log(obj);
obj[prop] = value;
// NOTE → Here, I should run the decorator defined for property obj[prop].
return true;
}
}
let foo = PersonProxied('pippo','pluto', Person);
С этой конфигурацией мне удается перехватывать каждый раз, когда изменяется свойство Person
. Хотя внутри validator
я не знаю, как (или если это вообще возможно) получить доступ к декораторам для данного свойства.
Если я прав, проблема в том, что функция IsString
вызывается только один раз для прототипа класса, а не для каждого экземпляра Person
. Таким образом, он не может правильно выполнить проверку на экземпляре класса.
На данный момент, я не знаю, возможно ли это вообще. Я имею в виду, я думаю, потому что, глядя в Интернете, я нашел несколько библиотек, которые работают так, но я хотел бы реализовать алгоритм сам и, в основном, понять, как он будет работать.
PS Iдо сих пор не знаю, как я мог поддерживать состояние проверки каждого свойства. Возможно, я мог бы просто иметь объект внутри Person
, что-то вроде:
class Person {
...
validatation = {
name: { hasError: true, errors: ['error1','error2'] },
surname: { hasError: false }
};
...
}