首页 > 社区问答列表 >多个不同类型的子类型拥有相同类的 @Type 类转换器

  多个不同类型的子类型拥有相同类的 @Type 类转换器

跟着我走,可能会变得有些混乱:

  • 我正在使用NestJs和class-validator/transformer。
  • 有一个可以包含两种类型的数组。
  • 我使用@Type通过鉴别器来定义项目。
  • 我使用Transform是因为它在序列化中是必需的,否则会创建空对象。

现在的问题是,我的鉴别器是一个包含7个值的枚举,其中6个指向一个类,最后一个指向另一个类。问题是,无论枚举类型是什么,当进行序列化时,它总是被更改为第一个子类型。


enum DiscrType = {A: "a", B: "b", C: "c"}

class Discriminator {
 @IsEnum(DiscrType)
 type: DiscrType 
}

class ClassONE extends Discriminator {...}
class ClassTWO extends Discriminator {...}

class Stuff {
 @Type(() => Discriminator, {
    discriminator: {
      property: 'type',
      subTypes: [
        { value: ClassTWO, name: DiscrType.C},
        { value: ClassONE, name: DiscrType.A}, // Always turns into this value even if it was B
        { value: ClassONE, name: DiscrType.B},
   
      ],
    },
    keepDiscriminatorProperty: true,
  })
 @Transform(
    ({ value }) =>
      value?.map((object: ClassONE | ClassTWO ) =>
        object.type === DiscrType.C
          ? plainToClass(classTWO, object)
          : plainToClass(ClassONE, object),
      ),
  )
  @ValidateNested({each: true})
  property: (ClassONE | ClassTWO )[]
}

行为:

new Stuff({type: DiscrType.B,...}) // Serialization with Class Serializer

// Expected: 
x = {type: "b",...}
// Actual: 
x = {type: "a",...} 


P粉702946921
P粉702946921

  • P粉141925181
  • P粉141925181   采纳为最佳   2023-08-04 11:59:19 1楼

    到目前为止,我不确定这是否是完美的解决方案,但在我的项目中,将@Type替换为这个后,所有的测试仍然可以运行。

    @Type((value) =>
        value.object.type === DiscrType.C? ClassTWO: ClassONE,
      )
    
    

    既然这个方法有效,我将把它作为解决方案,但请提到如果你知道为什么应该使用鉴别器而不是这个解决方案,有什么好处?

    +0 添加回复