我有如下代码。但我发现当我们像这样执行“TwoWheel | FourWheel”时,@ValidateNested 不支持。此外,我无法确定传入的有效负载车辆类型是两轮还是四轮。我也需要验证这一点。我怎样才能这样做?
请注意,这些只是我创建的虚拟类。实际上,我有 3 个类,每个类都有很多领域。只有其中一些是常见的。大多数都不是。
ChatGPT 建议创建自定义验证器。但我希望 Nestjs 可以内置一些我可以使用的东西。请建议更好的方法。
提前致谢。
class TwoWheel{
@IsNotEmpty()
@IsNumber()
speed: number;
@IsNotEmpty()
@IsString()
color: string
}
class FourWheel{
@IsNotEmpty()
@IsNumber()
speed: number;
@IsNotEmpty()
@IsString()
color: string
@IsNotEmpty()
@IsNumber()
numberOfSeats: number;
}
class Vehicle{
@ValidateNested()
VehicleType : TwoWheel | FourWheel
}
我尝试过的另一件事是类似的
@IsEnum([TwoWheel, FourWheel],{
message : "Invalid Vehicle Type"
})
VehicleType : TwoWheel | FourWheel
但是上面总是会返回错误信息。 至少获得@ValidateNested 对我来说也是胜利。 我需要在执行“VehicleType:TwoWheel | FourWheel”时验证嵌套字段 不想要太复杂的解决方案。只是想知道nestjs 中是否有我错过的东西。
您可以使用
@Type
中的 class-transformer
注释根据特定参数手动检查输入的类型。例如
export class VehicleA {
@IsNotEmpty()
doors: number;
}
export class VehicleB {
@IsNotEmpty()
doors: number;
@IsNotEmpty()
seats: number;
}
export class MyDTO {
@IsNotEmpty({
message: "Vehicle should not be empty"
})
@ValidateNested({ each: true })
@Type((options) => {
if (options?.object && "seats" in options.object.vehicle) {
return VehicleB;
}
return VehicleA;
})
vehicle: VehicleA | VehicleB;
}
在这种情况下,您可以使用
VehicleB
具有属性 seats
的事实,然后返回适当的类型,几乎就像类型保护器一样。