<p>少し混乱するかもしれませんので、フォローしてください:</p><p><ul><li>私は NestJ と class-validator/transformer を使用しています。 </li><li>2 つの型を含めることができる配列があります。 </li><li>@Type を使用して、識別子を介して項目を定義します。 </li><li>シリアル化で必要なため、Transform を使用しています。そうしないと、空のオブジェクトが作成されます。 </li></ul></p><p>問題は、私の識別子が 7 つの値を持つ列挙型であり、そのうちの 6 つは 1 つのクラスを指し、最後の 1 つは別の種類を指すことです。問題は、列挙型が何であっても、シリアル化するときに常に最初のサブタイプに変更されることです。 </p>
<pre class="brush:js;toolbar:false;">enum DiscrType = {A: "a", B: "b", C: "c"}
クラス識別子 {
@IsEnum(DiscrType)
タイプ: DiscrType
}
class ClassONE extends Discriminator {...}
class ClassTWO extends Discriminator {...}
クラス スタッフ {
@Type(() => 識別子、{
識別子: {
プロパティタイプ'、
サブタイプ: [
{ 値: ClassTWO、名前: DiscrType.C}、
{ value: ClassONE, name: DiscrType.A}, // B であっても常にこの値になります
{ 値: ClassONE、名前: DiscrType.B}、
]、
}、
keepDiscriminatorProperty: true、
})
@変身(
({ 値 }) =>
value?.map((オブジェクト: ClassONE | ClassTWO ) =>
object.type === DiscrType.C
? plainToClass(classTWO, オブジェクト)
: plainToClass(ClassONE, オブジェクト),
)、
)
@ValidateNested({それぞれ: true})
プロパティ: (ClassONE | ClassTWO )[]
}
</pre>
<p>動作:</p>
<pre class="brush:js;toolbar:false;">new Stuff({type: DiscrType.B,...}) // クラス シリアライザーによるシリアル化
// 期待される:
x = {タイプ: "b",...}
// 実際の:
x = {タイプ: "a",...}<span style="font-family:'sans serif、tahoma、verdana、helvetica';"><span style="white-space:nowrap;" > </span><
<p><br /></p>
これまでのところ、これが完璧な解決策であるかどうかはわかりませんが、私のプロジェクトでは、@Type をこれに置き換えた後でも、すべてのテストが実行されます。
リーリーこの方法は機能するので、解決策として残しておきますが、この解決策の代わりに discriminator を使用する理由と利点を知っている場合は言及してください。