Typescript 如何使用NestJS中的同一类更改嵌套对象中的验证

Typescript 如何使用NestJS中的同一类更改嵌套对象中的验证,typescript,nestjs,class-validator,Typescript,Nestjs,Class Validator,我有一个前端应用程序,它向我的后端应用程序发送一个带有以下JSON主体的POST请求 { "principal": { "name": "John Doe", "birth": "1990-01-01T02:00:00.000Z", "phone": "(12) 341 234 124",

我有一个前端应用程序,它向我的后端应用程序发送一个带有以下JSON主体的POST请求

{
    "principal": {
        "name": "John Doe",
        "birth": "1990-01-01T02:00:00.000Z",
        "phone": "(12) 341 234 124",
        "email": "test@test.com"
    },
    "companion": {
        "name": "",
        "birth": null,
        "phone": "",
        "email": ""
    },
    ... // some other data
}

在我的后端应用程序中,我正在使用NestJS,因为,
principal
companion
具有相同的属性,所以我映射到以下DTO

import { IsNotEmpty, IsString } from "class-validator";

export class NewDataDto {
    principal: PersonDto;
    companion: PersonDto;
    // some other data
}

export class PersonDto {
    @IsNotEmpty()
    @IsString()
    name: string;

    birth?: Date;

    @IsNotEmpty()
    @IsString()
    phone: string;

    @IsNotEmpty()
    @IsString()
    email: string;
} 

因此,在
principal
对象中,所有属性都是必需的,但在
companion
对象中,所有属性都是可选的。由于两个对象中的所有属性都相同,只有验证发生了变化,因此如何使用相同的类对两个对象进行验证?

因此我找到了问题的答案。确实有办法做到这一点。不使用同一个类,但不损害干式主体和重用代码。我会把它贴在这里,这样就可以让有同样问题的人受益

export class PersonDto {
    protected validateRequiredFields = false;
    
    @ValidateIf((o) => o.validateRequiredFields || o.name)
    @IsNotEmpty()
    @IsString()
    name: string;

    birth?: Date;

    @ValidateIf((o) => o.validateRequiredFields || o.phone)
    @IsNotEmpty()
    @IsString()
    phone: string;

    @ValidateIf((o) => o.validateRequiredFields || o.email)
    @IsNotEmpty()
    @IsString()
    email: string;
}

export class PrincipalDto extends PersonDto{
    constructor() {
        super();
        this.validateRequiredFields = true;
    }
}

export class NewDataDto {
    @ValidateNested()
    @Type(() => PrincipalDto)
    @IsDefined()
    principal: PrincipalDto;

    @ValidateNested()
    @Type(() => PersonDto)
    companion: PersonDto;

    // some other data
} 
这里有一些事情需要注意

首先,如果所有类都在同一个文件中,则需要首先声明没有依赖关系的类

其次,在
@ValidateIf
中,您需要将
validaterequired字段
与OR子句和要验证的字段放在一起,因为您希望验证字段是否具有某些值

第三,在我的例子中,验证母类时,请确保正确验证了
@Type
。并将
@IsDefined
放入要验证所需字段的属性中


最后,您可以在构造函数内部或外部重写
validateRequiredFields
,并且在子类中没有构造函数,这样就可以正常工作。但我个人喜欢构造器思想中的覆盖。

你试过了吗?是的,我试过了。但是我有两个具有不同验证的对象,它们是同一个类,因此,例如,
名称
,必须在
主体
中要求,但在
同伴
中可以为空。为验证目的创建单独的类怎么样?是的,我同意Bruno的观点,最好将类分开。还可以看看nest js中的映射类型包是的,这是一种解决方法。但严重违反了这一原则,使我不愿意遵循这一解决方案。