расширение существующего валидатора и установка только некоторых параметров - PullRequest
0 голосов
/ 15 апреля 2020

Мой столбец базы данных имеет тип с двойной точностью (из Postgres документов )

с двойной точностью 8 байтов с переменной точностью, неточный 15 точность десятичных цифр

Используя проверку классов, я хочу сделать проверку точности

@IsNumber()
/* precision check */
public myValue: number;

Здесь может помочь декоратор IsDecimal, поэтому @IsDecimal({ decimal_digits: '15' }) может помочь. Мне пришлось бы использовать этот декоратор для нескольких полей, есть ли способ расширить существующий декоратор и просто передать параметр decimal_digits? Я не думаю, что имеет смысл изобретать велосипед. Было бы хорошо, если бы я мог унаследовать проверку, но установить точность на меньше или равна 15 .

В настоящее время я создал свой собственный декоратор

@ValidatorConstraint()
class IsDoublePrecisionConstraint implements ValidatorConstraintInterface {
    public validate(value: any): boolean {
        if (typeof value === 'number') {
            if (value % 1 === 0) {
                return true;
            }

            const valueText: string = value.toString();
            const valueSegments: string[] = valueText.split('.');
            const decimalDigits: string = valueSegments[1];

            return decimalDigits.length <= 15;
        }

        return false;
    }

    public defaultMessage(args: ValidationArguments): string {
        return `${args.property} must have less than or equal to 15 decimal digits.`;
    }
}

export function IsDoublePrecision() {
    return (object: Record<string, any>, propertyName: string) => {
        registerDecorator({
            target: object.constructor,
            propertyName,
            validator: IsDoublePrecisionConstraint,
        });
    };
}

, но я Я не уверен, что этот способ справится с каждым делом.

Заранее спасибо

1 Ответ

1 голос
/ 15 апреля 2020

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

Моя идея создает «обычный» декоратор свойств и вызывает IsDecimal в этом декораторе с параметром decimal_digits.

// function as a const
export const IsDoublePrecision = () => { // use decorator factory way
  return (target: object, key: string) => { // return a property decorator function
    IsDecimal({ decimal_digits: '15' })(target, key); // call IsDecimal decorator
  }
}

Использование:

@IsNumber()
/* precision check */
@IsDoublePrecision()
public myValue: number;
...