Проверка JS с Декоратором - PullRequest
       11

Проверка JS с Декоратором

1 голос
/ 07 ноября 2019

Я пытаюсь построить модель в 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 }
  };
  ...
}
...