У меня есть такой DTO, и я пытаюсь разрешить string
и array
и проверить, является ли это string
или array
.
export class MyRequestDto extends SomeBaseRequestDto {
@IsOptional()
@IsString()
key?: string;
}
Когда я прошу об этом http://localhost:3000/path?key=123asd
, это работает.
Но когда я пытаюсь сделать этот запрос http://localhost:3000/path?key=123asd&key=321asd
, он не работает и выдает ошибку «псевдоним должен быть строкой».
когда я пробую что-то подобное, все работает отлично,
export class MyRequestDto extends SomeBaseRequestDto {
@IsOptional()
key?: string | string[];
}
Я не хочу этого делать, потому что мне нужно проверить, array
это или string
. Знаешь, как я могу это сделать?
Я пытался изменить DTO такими способами:
@IsOptional()
@IsArray()
@IsString({ each: true, message: "Each item should be string" })
и,
@IsOptional()
@IsArray()
@IsString()
и,
@IsOptional()
@IsString()
@IsArray()
и,
@IsOptional()
Для этого вам необходимо создать пользовательскую проверку.
Аналогичный вопрос: Как мой валидатор класса может проверить строку объединения | число?
@ValidatorConstraint({ name: 'string-or-array', async: false })
export class IsStringOrArray implements ValidatorConstraintInterface {
validate(input: any, args: ValidationArguments) {
return typeof input === 'string' || Array.isArray(input);
}
defaultMessage(args: ValidationArguments) {
return '($value) must be string or array';
}
}
Тогда вам придется использовать его так:
export class MyRequestDto extends SomeBaseRequestDto {
@IsOptional()
@Validate(IsStringOrArray)
key?: string | string[];
}