Управление порядком применения декораторов свойств машинописи? - PullRequest
0 голосов
/ 06 июня 2018

Я подумываю написать валидатор, который проверяет, больше ли одно значение, чем другое.Например, цена покупки превышает цену продажи.

Но сначала мы должны убедиться, что цена продажи действительна.Таким образом, у нас может быть что-то вроде этого:

class Product {        

    @IsNumber
    @IsPositive
    purchasePrice: Number;

    @IsNumber
    @IsPositive
    @IsGreaterThan('purchasePrice')
    salesPrice: Number;
}

В этом случае @IsNumber и @IsPositive должны выполняться в обоих свойствах до того, как аннотация @IsGreaterThan будет выполнена.

Мне интересно, является ли это чем-то простым для реализации (возможно, с некоторыми метаданными уровня класса) или мне просто нужно написать простые валидаторы функций для проверки такого типа вещей.

Я не эксперт по декорации, но одна мысль заключалась бы в том, чтобы в каждый декоратор были встроены метаданные валидации с использованием такого числа, чтобы выполнение валидаторов сортировалось по этому номеру.

Итакнапример, валидатору @IsGreaterThan может быть присвоен номер 2, а другим - номер 1, и это означает, что валидатор должен сначала выполнить тегированные валидаторы 1, а затем 2.

1 Ответ

0 голосов
/ 06 июня 2018

Декоратор не должен зависеть от порядка использования.Все они должны быть автономными и работать независимо друг от друга.

В этом случае @IsGreaterThan должен иметь @IsNumber для внутреннего использования, чтобы обеспечить целевое число.

С другой стороны, управлениезаказ прост.Ближайший применяется первым.Так что в вашем случае вам нужно

class Product {
  @IsGreaterThan('purchasePrice')
  @IsPositive
  @IsNumber
  salesPrice: number
}

Декоратор - это просто сахар функции дескриптора, которая является функцией более высокого порядка, например:

function IsNumber(target, key, descriptor) { ... }

Так что приведенный выше код на самом делепросто (псевдокод):

class Product {
  salesPrice = IsGreaterThan('puchasePrice')(IsPositive(IsNumber(Product, 'salesPrice')))
}

Поскольку синтаксис class сам по себе является сахаром, приведенный выше код выглядит странно, поскольку я просто пытаюсь показать вам базовую концепцию.

...