扩展现有验证器并仅设置一些选项

extending existing validator and only set some options

我的数据库列是双精度类型(来自Postgres docs

double precision 8 bytes variable-precision, inexact 15 decimal digits precision

使用 class-validator 我想进行精度检查

@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,
        });
    };
}

但我不确定这个是否能够处理所有情况。

提前致谢

我没有找到任何关于扩展 class-validator 的现有装饰器的示例,但是 IsDecimal 只是一个普通的 属性 装饰器,那么我们可以将它用作 属性装饰器。

我的想法是创建一个 "normal" 属性 装饰器并在这个装饰器中使用 decimal_digits 选项调用 IsDecimal

// 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;