NestJS/Class-transformer @Type Discriminator 对象无法正确验证数据

aPu*_*Dev 5 node.js nestjs

我有一个通用类如下:

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;
}
Run Code Online (Sandbox Code Playgroud)

以及继承该类的两个类

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;
}

Run Code Online (Sandbox Code Playgroud)

和:

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;
}
Run Code Online (Sandbox Code Playgroud)

这些在 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;
}

Run Code Online (Sandbox Code Playgroud)

我期望控制器将此 DTO 作为参数:拒绝所有不符合 BodyValidator 或 CaseTwoValidator 格式的请求正文为错误请求。

当前行为:API 请求非常宽松,并且不强制执行嵌套检查。

我想知道我在这个问题上花了 3 个小时是否遗漏了一些明显的东西。

小智 4

不久前我遇到了完全相同的问题,并发现装饰器不适用于继承的类。装饰器,即 ( @IsString) 必须直接应用于类,因此不幸的是,您必须将父类中的字段重新定义为子 DTO 的字段。

请参阅此处的 TypeScript 文档。具体这部分

方法装饰器不能在声明文件中、重载时使用