我想在对象构造函数中使用 validateSync,但我不能将它与继承一起使用。
我有这样的事情:
import { IsNotEmpty, IsString, validateSync, validate } from 'class-validator';
class Animal {
@IsNotEmpty()
@IsString()
public name: string;
constructor(name: string) {
this.name = name;
this.validate() // this method calls validate of class Dog, since this is an instance of Dog
}
protected validate() {
const errors = validateSync(this);
if (errors.length > 0) {
console.log("Animal validation error: ", errors)
}
}
}
class Dog extends Animal {
@IsNotEmpty()
@IsString()
public breed: string;
constructor(name: string, breed: string) {
super(name);
this.breed = breed
this.validate()
}
protected validate() {
const errors = validateSync(this);
if (errors.length > 0) {
console.log("Dog validation error: ", errors)
}
}
}
const dog = new Dog('Aaron', 'Golden Retriever')
结果是:
Dog validation error: [ ValidationError {
target: Dog { name: 'Aaron' },
value: undefined,
property: 'breed',
children: [],
constraints:
{ isString: 'breed must be a string',
isNotEmpty: 'breed should not be empty' } } ]
当我调用 Dog 构造函数时,代码会运行 Animal 类的 super() 和 this.validate()。此方法验证 Dog 的实例,并且由于 Animal 没有品种属性,因此代码会抛出上面的错误。
我不知道如何解决这个问题,也许将验证放在构造函数中并不是一个好主意。
是否有解决方法或更好的方法来做到这一点?