多個不同類型的子類型擁有相同類別的 @Type 類別轉換器
P粉702946921
P粉702946921 2023-08-03 13:32:17
0
1
599
<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?.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粉702946921
P粉702946921

全部回覆(1)
P粉141925181

到目前為止,我不確定這是否是完美的解決方案,但在我的專案中,將@Type替換為這個後,所有的測試仍然可以運行。

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

既然這個方法有效,我將把它當作解決方案,但請提到如果你知道為什麼應該使用鑑別器而不是這個解決方案,有什麼好處?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!