我花了很多时间来解决这个问题,我终于找到了一种比当前答案更干净的方法。
基本上,@Type
如果我们想使用装饰器,装饰器会为我们提供一些辅助选项,比如我们..对象!因此,您可以有条件地返回一种或另一种类型,因此验证是通过以下两种类型之一完成的:
class Feature {
name: string
@ValidateNested()
@IsDefined()
@Type(({ object }) => {
if(object.option?.kind === 'color') return ColorFeature;
else if(object.option?.kind === 'size') return SizeFeature;
// Handle edge case where the previous ifs are not fullfiled
})
option: ColorFeature | SizeFeature
}
如果您有更多类型,您甚至可以使用 aswitch case
来保持清洁:
@ValidateNested()
@IsDefined()
@Type(({ object }) => {
switch(object.option?.kind){
case 'color':
return ColorFeature;
case 'size':
return SizeFeature;
case 'shape':
return ShapeFeature;
default:
// Manage edge cases
}
})
option: ColorFeature | SizeFeature | ShapeFeature
然后,您还必须在扩展类中使用验证装饰器,以便正确验证它们。