需要类验证器如果

问题描述 投票:0回答:1

我有这门课

class A {
  @IsString()
  @MaxLength(99)
  prop1: string 

  @IsBoolean()
  prop2: boolean
}

我希望它是:

  1. 绳子。
  2. 必需(如果 prop2 为 true)。
  3. 如果 prop2 为 false,则可选。

在类验证器中,有

@ValidateIf()

class A {
  @IsString()
  @MaxLength(99)
  @ValidateIf((obj) => obj.prop2)
  prop1: string

  @IsBoolean()
  prop2: boolean
}

确实,当 prop2 为

ValidateIf()
时,
false
将使 prop1 成为可选。但它会禁用我对
@MaxLength()
@IsString()
的检查。现在你可以传递一个号码了!那不是我想要的。我只是希望它是可选的。

我在想,有没有办法说

@IsRequiredIf()
@IsOptionalIf()
而不是说
@ValidateIf()

typescript class-validator
1个回答
0
投票

我创建了自己的

IsOptionalIf()
装饰器:

import { type ValidationMetadataArgs } from 'class-validator/types/metadata/ValidationMetadataArgs'
import { type ValidationOptions, ValidationTypes, getMetadataStorage } from 'class-validator'
import { ValidationMetadata } from 'class-validator/cjs/metadata/ValidationMetadata'

export const IS_OPTIONAL_IF = 'isOptionalIf'

export function IsOptionalIf(
  condition: (object: any, value: any) => boolean,
  validationOptions?: ValidationOptions
): PropertyDecorator {
  return function (object: object, propertyName: string): void {
    const args: ValidationMetadataArgs = {
      type: ValidationTypes.CONDITIONAL_VALIDATION,
      name: IS_OPTIONAL_IF,
      target: object.constructor,
      propertyName: propertyName,
      constraints: [
        (object: any, value: any): boolean => {
          const performValidation = condition(object, value)
          if (!performValidation) return true
          else return object[propertyName] !== null && object[propertyName] !== undefined
        },
      ],
      validationOptions: validationOptions,
    }
    getMetadataStorage().addValidationMetadata(new ValidationMetadata(args))
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.