多個不同類型的子類型擁有相同類別的 @Type 類別轉換器
P粉702946921
2023-08-03 13:32:17
<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>
到目前為止,我不確定這是否是完美的解決方案,但在我的專案中,將@Type替換為這個後,所有的測試仍然可以運行。
既然這個方法有效,我將把它當作解決方案,但請提到如果你知道為什麼應該使用鑑別器而不是這個解決方案,有什麼好處?