typescript 类验证器的多重验证器

qqrboqgw  于 2023-05-23  发布在  TypeScript
关注(0)|答案(2)|浏览(139)

我使用class-validator作为Nestjs
我有一个DTO:

export default class CatDto extends BaseDto {
  @IsNotEmpty()
  @Expose()
  name: string;

  @IsNumber()
  @Expose()
  age: number;
}

age可以是@IsNumber()@IsNumberString()
10'10'都有效。
我能做到吗?.

wn9m85ua

wn9m85ua1#

这是目前类验证器包本身的一个开放问题。这就是为什么我认为你应该实现自己的自定义验证器,你可以在这里找到这样一个自定义验证器来验证多个类型:https://github.com/typestack/class-validator/issues/160
下面是可以验证多个类型的自定义验证器的示例:

const typeValidator = {
    "string": function (value: any, args: ValidationArguments) {
        const validator = new Validator();
        return validator.isString(value);
    },
    "int": function (value: any, args: ValidationArguments) {
        const validator = new Validator();
        return validator.isInt(value);
    }
};

export function IsType(types: (keyof (typeof typeValidator))[], validationOptions?: ValidationOptions) {
    return function (object: Object, propertyName: string) {
        registerDecorator({
            name: "wrongType",
            target: object.constructor,
            propertyName: propertyName,
            options: validationOptions,
            validator: {
                validate(value: any, args: ValidationArguments) {
                    return types.some(v => typeValidator[v](value, args));
                },
                defaultMessage(validationArguments?: ValidationArguments) {
                    const lastType = types.pop();
                    if (types.length == 0)
                        return `Has to be ${lastType}`;
                    return `Can only be ${types.join(", ")} or ${lastType}.`;
                }
            }
        });
    };
}

然后你可以将上面的代码实现到你的代码中,如下所示:

export default class CatDto extends BaseDto {
  @IsNotEmpty()
  @Expose()
  name: string;

  @IsType(["string", "int"])
  @Expose()
  age: number;
}
kyxcudwk

kyxcudwk2#

import { IsNotEmpty, IsNumberString, ValidateIf } from 'class-validator';

export class MyDto {
  @IsNotEmpty()
  name: string;

  @ValidateIf((object, value) => typeof value === 'string' || typeof value === 'number')
  @IsNumberString()
  age: string | number;
}

你可以做这样的事情来达到你想要的结果。

相关问题