📜  嵌套自定义类验证器 - TypeScript (1)

📅  最后修改于: 2023-12-03 14:53:58.307000             🧑  作者: Mango

嵌套自定义类验证器 - TypeScript

在 TypeScript 中,有时需要对一个类中嵌套的属性进行验证,为了方便,可以使用嵌套自定义类验证器。

创建自定义验证器

先定义一个简单的类:

class Person {
  constructor(public name: string, public age: number) {}
}

我们需要为这个类定义一个验证器,假设要验证这个类的年龄必须大于等于18岁:

import { ValidationOptions, ValidateBy, buildMessage } from 'class-validator';

export function IsAdult(validationOptions?: ValidationOptions) {
  return ValidateBy(
    {
      name: 'isAdult',
      validator: {
        validate(value: Person) {
          return value.age >= 18;
        },
        defaultMessage: buildMessage(
          (eachPrefix) => eachPrefix + '$property must be an adult.',
          validationOptions,
        ),
      },
    },
    validationOptions,
  );
}

这里使用了 class-validator 库提供的 ValidationOptionsValidateBy 两个函数,而 IsAdult 则是一个自定义的验证器函数,接收一个可选的 validationOptions 参数。

其中, ValidateBy 为类定义一个验证器,第一个参数是一个对象,包含两个属性。其中, name 是验证器的名称,在后续的使用中需要用到; validator 是实现验证的函数,其中的 validate 函数用于验证属性值是否合法,而 defaultMessage 函数用于生成错误信息。

使用自定义验证器

在需要验证的类中,可以引用定义好的验证器,使用装饰器将其应用到需要验证的属性上:

class Student {
  constructor(public name: string, public age: number, public teacher: Person) {}

  @IsNotEmpty()
  public name: string;

  @IsAdult()
  public age: number;

  @ValidateNested()
  public teacher: Person;
}

其中, @IsNotEmpty() 等是库中提供的装饰器,可以通过装饰器为属性定义多个验证规则。

而对于嵌套属性的验证,需要使用 class-validator 库提供的 @ValidateNested 装饰器。

示例代码

完整的示例代码如下:

import {
  ValidationOptions,
  ValidateBy,
  buildMessage,
  ValidateNested,
  IsNotEmpty,
} from 'class-validator';

class Person {
  constructor(public name: string, public age: number) {}
}

export function IsAdult(validationOptions?: ValidationOptions) {
  return ValidateBy(
    {
      name: 'isAdult',
      validator: {
        validate(value: Person) {
          return value.age >= 18;
        },
        defaultMessage: buildMessage(
          (eachPrefix) => eachPrefix + '$property must be an adult.',
          validationOptions,
        ),
      },
    },
    validationOptions,
  );
}

class Student {
  constructor(public name: string, public age: number, public teacher: Person) {}

  @IsNotEmpty()
  public name: string;

  @IsAdult()
  public age: number;

  @ValidateNested()
  public teacher: Person;
}

// 创建一个合法的示例对象
const validStudent = new Student('Alice', 18, new Person('Bob', 35));

// 执行验证
validate(validStudent)
  .then((errors) => {
    if (errors.length > 0) {
      console.log('Validation failed. Errors: ', errors);
    } else {
      console.log('Validation succeeded.');
    }
  })
  .catch((e) => {
    console.log('Unexpected error during validation: ', e);
  });

注意,在运行代码前需要先安装 class-validator 库:

npm install class-validator