Heim  >  Fragen und Antworten  >  Hauptteil

Mehrere @Type-Klassenkonverter derselben Klasse für Untertypen unterschiedlicher Typen

<p>Folgen Sie mir, es könnte etwas verwirrend werden:</p><p><ul><li>Ich verwende NestJs und Class-Validator/Transformer. </li><li>Es gibt ein Array, das zwei Typen enthalten kann. </li><li>Ich verwende @Type, um Elemente über Diskriminatoren zu definieren. </li><li>Ich verwende Transform, weil es für die Serialisierung erforderlich ist, andernfalls werden leere Objekte erstellt. </li></ul></p><p>Das Problem ist nun, dass mein Diskriminator eine Aufzählung mit 7 Werten ist, 6 davon zeigen auf eine Klasse und der letzte zeigt auf eine andere Art. Das Problem besteht darin, dass unabhängig vom Aufzählungstyp bei der Serialisierung immer in den ersten Untertyp geändert wird. </p><p><br /></p> <pre class="brush:js;toolbar:false;">enum DiscrType = {A: "a", B: "b", C: "c"} Klasse Diskriminator { @IsEnum(DiscrType) Typ: DiscrType } Klasse ClassONE erweitert Discriminator {...} Klasse ClassTWO erweitert Discriminator {...} Klassenmaterial { @Type(() => Diskriminator, { Diskriminator: { Art der Immobilie', Untertypen: [ {Wert: ClassTWO, Name: DiscrType.C}, { value: ClassONE, name: DiscrType.A}, // Wird immer in diesen Wert umgewandelt, auch wenn es B war {Wert: ClassONE, Name: DiscrType.B}, ], }, keepDiscriminatorProperty: true, }) @Verwandeln( ({ Wert }) => value?.map((object: ClassONE | ClassTWO ) => object.type === DiscrType.C ? plainToClass(classTWO, object) : plainToClass(ClassONE, Objekt), ), ) @ValidateNested({each: true}) Eigenschaft: (ClassONE | ClassTWO )[] } </pre> <p>Verhalten:</p> <pre class="brush:js;toolbar:false;">new Stuff({type: DiscrType.B,...}) // Serialisierung mit Class Serializer // Erwartet: x = {Typ: "b",...} // Tatsächlich: 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粉702946921416 Tage vor565

Antworte allen(1)Ich werde antworten

  • P粉141925181

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

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

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

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

    Antwort
    0
  • StornierenAntwort