машинописный код - валидатор класса - проверка на основе другого типа - PullRequest
0 голосов
/ 27 марта 2020

Я работаю с 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;
}

Проблема здесь в том, что у меня есть это поле: validation в modelCreate, и это поле является объектом и может иметь несколько свойств и может выглядеть так в db:

validation: {
   required: true,
   text: 2
}

или может выглядеть так:

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

, и это будет зависеть от свойства type modelCreate , потому что если типом является «ВРЕМЯ», я хотел бы иметь проверку для этого:

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

, а если типом является «НОМЕРЫ», я хотел бы иметь проверку как это

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

Итак, вопрос в том, как бы я мог переключать разные классы в поле валидации на основе значения поля типа в валидаторе класса, и это вообще возможно?

1 Ответ

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

для этого вам нужно создать 2 класса, для каждого случая, строку и число. Затем измените тип validation: StringBaseValidation | NumberBaseValidation;, теперь класс-валидатор может различать guish случаев.

Если данные поступают из запроса, вам нужно использовать @Type((obj) => obj.writeConditionToDetectString ? StringBaseValidation : NumberBaseValidation), чтобы помочь библиотеке понять, какой тип это данные из запроса.

...