Penukar kelas @Type berbilang kelas yang sama untuk subjenis jenis yang berbeza
P粉702946921
P粉702946921 2023-08-03 13:32:17
0
1
639
<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>
P粉702946921
P粉702946921

membalas semua(1)
P粉141925181

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.

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

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?

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan