📅  最后修改于: 2023-12-03 14:53:58.307000             🧑  作者: Mango
在 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
库提供的 ValidationOptions
和 ValidateBy
两个函数,而 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