我想使在DTO本身的另一个字段的基础上需要的字段.

目前我的DTO如下所示:

import { LOGIN_TYPE } from "src/utils/constants";
import { IsIn, IsNotEmpty, IsOptional } from "class-validator";

export class LoginDto {
    @IsOptional()
    phoneNumber: string

    @IsOptional()
    fcmToken: string

    @IsOptional()
    accessToken: string

    @IsOptional()
    @IsIn([LOGIN_TYPE.APPLE, LOGIN_TYPE.GOOGLE, LOGIN_TYPE.FACEBOOK, LOGIN_TYPE.PHONE_NUMBER_OTP])
    loginType: string = LOGIN_TYPE.PHONE_NUMBER_OTP;
}

但问题是,我不想盲目地把它变成可选的.

如果"loginType"=PHONE_NUMBER_OTP,我希望"phoneNumber"作为必选参数 如果"loginType"=Google||Apple||Facebook,我希望"accesToken"作为必选参数

我如何在DTO本身中实现这一点.

我已经使用了{Transform:True}.以另一种方式处理任何帮助或建议都是非常特殊的!提前谢谢你了

try :将所有内容设置为可选,但我不想在我的服务中处理这些东西 期望:我希望在DTO本身中处理此验证

推荐答案

您可以使用conditional validation:

import { LOGIN_TYPE } from "src/utils/constants";
import { IsIn, IsNotEmpty, IsOptional, ValidateIf } from "class-validator";

export class LoginDto {
    @IsOptional()
    phoneNumber: string

    @IsOptional()
    fcmToken: string

    @ValidateIf((body) => [LOGIN_TYPE.APPLE, LOGIN_TYPE.GOOGLE, LOGIN_TYPE.FACEBOOK].includes(body.loginType))
    @IsNotEmpty()
    accessToken: string

    @IsOptional()
    @IsIn([LOGIN_TYPE.APPLE, LOGIN_TYPE.GOOGLE, LOGIN_TYPE.FACEBOOK, LOGIN_TYPE.PHONE_NUMBER_OTP])
    loginType: string = LOGIN_TYPE.PHONE_NUMBER_OTP;
}

如果@ValidateIf()回调返回FALSE,则忽略accessToken上的验证规则.

Typescript相关问答推荐

ReturnType此索引方法与点表示法之间的差异

angular 17独立使用多个组件(例如两个组件)

HttpClient中的文本响应类型选项使用什么编码?''

迁移到Reaction路由V6时,获取模块Reaction-Router-Dom';没有导出的成员RouteComponentProps错误

如何提取密钥及其对应的属性类型,以供在新类型中使用?

打字脚本中泛型和直接类型重新映射的不同行为

学习Angular :无法读取未定义的属性(正在读取推送)

如何在TypeScrip中从字符串联合类型中省略%1值

是否可以从函数类型中创建简化的类型,go 掉参数中任何看起来像回调的内容,而保留其余的内容?

Angular 自定义验证控件未获得表单值

有没有可能创建一种类型,强制在TypeScrip中返回`tyPeof`语句?

自动通用回调

如何将类似数组的对象(字符串::匹配结果)转换为类型脚本中的数组?

如何解决&Quot;类型不可分配给TypeScrip IF语句中的类型&Quot;?

TypeScrip:如何缩小具有联合类型属性的对象

React中的效果挂钩在依赖项更新后不会重新执行

如何在Typescript 中定义具有相同类型的两个泛型类型的两个字段?

在Nestjs中,向模块提供抽象类无法正常工作

解析错误:DeprecationError: 'originalKeywordKind' 自 v5.0.0 起已被弃用,无法再使用

对象可能未定义(通用)