搜索

首页  >  问答  >  正文

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

<p>跟着我走,可能会变得有些混乱:</p><p><ul><li>我正在使用NestJs和class-validator/transformer。</li><li>有一个可以包含两种类型的数组。</li><li>我使用@Type通过鉴别器来定义项目。</li><li>我使用Transform是因为它在序列化中是必需的,否则会创建空对象。</li></ul></p><p>现在的问题是,我的鉴别器是一个包含7个值的枚举,其中6个指向一个类,最后一个指向另一个类。问题是,无论枚举类型是什么,当进行序列化时,它总是被更改为第一个子类型。</p><p><br /></p> <pre class="brush:js;toolbar:false;">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 )[] } </pre> <p>行为:</p> <pre class="brush:js;toolbar:false;">new Stuff({type: DiscrType.B,...}) // Serialization with Class Serializer // Expected: x = {type: "b",...} // Actual: x = {type: "a",...}<span style="font-family:'sans serif, tahoma, verdana, helvetica';"><span style="white-space:nowrap;"> </span></span></pre> <p><br /></p>
P粉702946921P粉702946921480 天前612

全部回复(1)我来回复

  • P粉141925181

    P粉1419251812023-08-04 11:59:19

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

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

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

    回复
    0
  • 取消回复