我有一个泛型类如下:
import {IsArray, IsNotEmpty, IsString, ValidateNested} from "class-validator";
import {PatientInfoValidator} from "./businessInfo/PatientInfoValidator";
import {TypeValidator} from "./TypeValidator";
import {Type} from "class-transformer";
export class GenericValidator {
@IsString()
@IsNotEmpty()
userId: string;
@ValidateNested({each:true})
@Type(() => TypeValidator)
type: TypeValidator;
}和两个从这个类继承的类
import {IsArray, IsNotEmpty, IsString, ValidateNested} from "class-validator";
import {PatientInfoValidator} from "./businessInfo/PatientInfoValidator";
import {Type} from "class-transformer";
import {BusinessInfoValidator} from "./BusinessInfoValidator";
import {GenericValidator} from "./GenericValidator";
import {TypeValidator} from "./TypeValidator";
export class BodyValidator extends GenericValidator {
@IsString()
@IsNotEmpty()
userId: string;
@ValidateNested({each:true})
@Type(() => TypeValidator)
type: TypeValidator;
@ValidateNested({each:true})
@Type(() => BusinessInfoValidator)
businessInformation: BusinessInfoValidator;
@IsArray()
sheetLink: string[];
validate: boolean;
}和:
import {GenericValidator} from "./GenericValidator";
import {IsNotEmpty, IsString, ValidateNested} from "class-validator";
import {Type} from "class-transformer";
import {TypeValidator} from "./TypeValidator";
export class CaseTwoValidator extends GenericValidator {
@IsString()
@IsNotEmpty()
userId: string;
@ValidateNested({each:true})
@Type(() => TypeValidator)
type: TypeValidator;
newKey: string;
}这些在DTO中用于验证:
import { ApiProperty } from '@nestjs/swagger';
import {ValidateNested} from "class-validator";
import { Type } from 'class-transformer';
import { BodyValidator} from "../validators/BodyValidator";
import { GenericValidator} from "../validators/GenericValidator";
import { CaseTwoValidator} from "../validators/CaseTwoValidator";
export class CreateSheetsDto {
@ApiProperty()
@ValidateNested({ each: true })
@Type(() => GenericValidator, {
keepDiscriminatorProperty: true,
discriminator: {
property: "type.label",
subTypes: [
{ value: BodyValidator, name: "Hors dissection et syndrome neurologique" },
{ value: CaseTwoValidator, name: "NewCase" }
]
}
})
readonly body: BodyValidator | CaseTwoValidator;
}我期望以这个DTO作为参数的控制器:拒绝所有不符合BodyValidator或CaseTwoValidator格式的请求体。
当前行为: API请求非常宽松,不强制嵌套检查。
我想知道我是不是错过了一些显而易见的事情,在这个问题上花了3个小时。
发布于 2020-07-01 06:50:57
不久前,我遇到了同样的问题,发现装饰器不适用于继承的类。装饰器,即(@IsString)必须直接应用于类,因此不幸的是,您必须将父类中的字段重新定义为您的子类DTO。
请参阅此TypeScript上的这里文档。特别是这部分
方法修饰器不能在声明文件中用于重载。
https://stackoverflow.com/questions/62154082
复制相似问题