打字稿-类验证器-根据不同类型进行验证

时间:2020-03-27 17:47:27

标签: typescript typeorm class-validator

我正在使用TypeORM,并且我想根据其他字段的值提供与字段不同的内容。因此,请解释一下,这是我的DTO模型的外观:

import { IsString, IsOptional, IsNumber, IsEnum, IsObject, IsBoolean, ValidateNested } from 'class-validator';

export enum AttributeTypes {
    DATE = 'DATE',
    TIME = 'TIME',
    NUMBERS = 'NUMBERS',
}

export class BaseValidation {
    @IsOptional()
    @IsBoolean()
    required: boolean;
}

export class modelCreate {
    @IsOptional()
    @IsNumber()
    id: number;

    @IsOptional()
    @IsString()
    label: string;

    @IsOptional()
    @IsEnum(AttributeTypes)
    type: AttributeTypes;

    @IsOptional()
    @IsObject()
    @ValidateNested()
    validation: BaseValidation;
}

这里的问题是我有以下字段:modelCreate中的 validation ,并且该字段是一个对象,可以具有多个属性,并且在db中看起来像这样:

validation: {
   required: true,
   text: 2
}

或者看起来像这样:

   validation: {
       required: false,
       number: 1,
       maxNumber: 10
    }

,这将取决于modelCreate的 type 属性,因为如果type为'TIME',我希望对此进行验证:

BaseValidation {
    @IsBoolean()
     required: true,
    @IsString()
    text: 2
}

如果类型为“ NUMBERS”,我想进行这样的验证

  BaseValidation {
           @IsBoolean()
           required: boolean,
           @IsNumber()
           number: number,
           @IsNumber()
           maxNumber: number
        }

所以问题是我将如何基于类验证器中的类型字段值来遍历验证字段中的不同类,这甚至有可能吗?

1 个答案:

答案 0 :(得分:1)

为此,您需要为每种情况创建2个类,字符串和数字。 然后更改类型validation: StringBaseValidation | NumberBaseValidation;,现在class-validator可以区分大小写。

如果数据来自请求,则需要使用@Type((obj) => obj.writeConditionToDetectString ? StringBaseValidation : NumberBaseValidation)来帮助lib理解请求中的数据是哪种类型。