Penukar kelas @Type berbilang kelas yang sama untuk subjenis jenis yang berbeza
P粉702946921
2023-08-03 13:32:17
<p>Ikut saya, ia mungkin menjadi sedikit mengelirukan:</p><p><ul><li>Saya menggunakan NestJs dan class-validator/transformer. </li><li>Terdapat tatasusunan yang boleh mengandungi dua jenis. </li><li>Saya menggunakan @Type untuk menentukan item melalui diskriminasi. </li><li>Saya menggunakan Transform kerana ia diperlukan dalam siri, jika tidak, objek kosong akan dibuat. </li></ul></p><p>Sekarang masalahnya ialah pendiskriminasi saya ialah enum dengan 7 nilai, 6 daripadanya menunjuk ke satu kelas dan yang terakhir menunjuk kepada jenis lain. Masalahnya ialah tidak kira apa jenis enum, apabila bersiri ia sentiasa ditukar kepada subjenis pertama. </p><p><br /></p>
<pre class="brush:js;toolbar:false;">enum DiscrType = {A: "a", B: "b", C: "c"}
Diskriminasi kelas {
@IsEnum(DiscrType)
jenis: DiscrType
}
kelas ClassONE memanjangkan Diskriminator {...}
kelas ClassTWO memanjangkan Diskriminator {...}
barang kelas {
@Type(() => Diskriminasi, {
diskriminasi: {
Jenis hartanah',
subJenis: [
{ nilai: ClassTWO, nama: DiscrType.C},
{ value: ClassONE, name: DiscrType.A}, // Sentiasa bertukar menjadi nilai ini walaupun ia adalah B
{ nilai: ClassONE, nama: DiscrType.B},
],
},
keepDiscriminatorProperty: true,
})
@Transform(
({ nilai }) =>
value?.map((objek: ClassONE | ClassTWO ) =>
object.type === DiscrType.C
? plainToClass(kelasTWO, objek)
: plainToClass(ClassONE, objek),
),
)
@ValidateNested({setiap: benar})
harta: (ClassONE | ClassTWO )[]
}
</pra>
<p>Tingkah laku:</p>
<pre class="brush:js;toolbar:false;">new Stuff({type: DiscrType.B,...}) // Serialisasi dengan Class Serializer
// Dijangka:
x = {jenis: "b",...}
// Sebenar:
x = {type: "a",...}<span style="font-family:'sans serif, tahoma, verdana, helvetica';"><span style="white-space:nowrap;" > </span></span></pre>
<p><br /></p>
Setakat ini, saya tidak pasti sama ada ini adalah penyelesaian yang sempurna, tetapi dalam projek saya, selepas menggantikan @Type dengan ini, semua ujian masih berjalan.
Memandangkan kaedah ini berkesan, saya akan membiarkannya sebagai penyelesaian, tetapi sila nyatakan jika anda tahu mengapa saya perlu menggunakan diskriminator dan bukannya penyelesaian ini, apakah faedahnya?