多个不同类型的子类型拥有相同类的 @Type 类转换器
P粉702946921
P粉702946921 2023-08-03 13:32:17
0
1
611
<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 }) => 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,
  )

既然这个方法有效,我将把它作为解决方案,但请提到如果你知道为什么应该使用鉴别器而不是这个解决方案,有什么好处?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板