plainToInstance 无法转换复杂的子属性。

huangapple go评论60阅读模式
英文:

plainToInstance cannot convert complex sub-properties

问题

我想将一个实体转换为DTO对象。实体包含与相应的DTO类型相比多余的属性,我不希望暴露这些属性。

困难在于两个对象都包含实体和DTO的属性。

似乎 plainToInstance 在子属性转换方面存在问题。

以下是用于转换的代码:

plainToInstance(DtoA, entityObjectA, { excludeExtraneousValues: true, exposeUnsetFields: false, enableImplicitConversion: true })

excludeExtraneousValues 设置为 true 以避免暴露信息。
exposeUnsetFields 设置为 false 以避免污染DTO对象。
enableImplicitConversion 设置为 true 以尝试将子实体转换为子DTO对象。

似乎隐式转换并不按我所期望的方式工作。

问题示例:


export class DtoA {
	public dtos: DtoB[];
}

export class DtoB {
	public dtos: DtoC[];
}

export class DtoC {
	// 一些属性
}

在实体方面,属性具有相同的名称,但当然,这些属性是实体,而不是DTO。

当在EntityA 上使用 plainToInstance 时,如上所述,我得到:

{
	dtos: [{}, {}, {}]
}

其中子实体未转换为DTO对象。

如果我将 JSON.stringify(entityObjectA) 传递给 plainToInstance,而不是 entityObjectA,我会得到一个字符串,其中所有引号都被转义,而不是一个DtoA对象:

"{\"dtos\":[{\"dtos\": ...}]}"

更多信息:

  • 这些实体和DTO对象在外部TypeScript库中声明
  • 所有DTO对象的属性都具有 @expose() 装饰器
  • class-transformer 版本 ^0.5.1 在运行 plainToInstance 的项目和库中都使用

我漏掉了什么?

谢谢您。

英文:

I want to convert an Entity into a DTO object. Entities contain extra properties compared to the corresponding DTO type, which I don't want exposed.

The difficulty is that both objects contains properties that are also entities and DTOs.

It seems that plainToInstance struggles with sub-properties conversion.

Here is the used code to convert:

plainToInstance(DtoA, entityObjectA, { excludeExtraneousValues: true, exposeUnsetFields: false, enableImplicitConversion: true })

excludeExtraneousValues set to true to avoid exposing information.
exposeUnsetFields set to false to avoid polluting the DTO object.
enableImplicitConversion set to true to try to convert sub-entities into sub-DTO objects.

It seems that the implicit conversion does not do what I expect.

Example of the issue:


export class DtoA {
	public dtos: DtoB[];
}

export class DtoB {
	public dtos: DtoC[];
}

export class DtoC {
	// some properties
}

On entity side, properties are named the same, but of course, properties are entities, not DTOs.

When using plainToInstance, like above, on EntityA, I get:

{
	dtos: [{}, {}, {}]
}

Where sub-entities are not converted to DTO objects.

If I pass JSON.stringify(entityObjectA) to plainToInstance instead of entityObjectA, I get a a string, where all quotes are escaped, instead of an object DtoA:

"{\"dtos\":[{\"dtos\": ...}]}"

More information:

  • These entities & DTO objects are declared in an external typescript library
  • All DTO objects' properties have the @expose() decorator
  • class-transformer version ^0.5.1 in both the project running plainToInstance and in the library

What am I missing?

Thank you

答案1

得分: 0

我找到了问题。要在选项excludeExtraneousValues中使用plainToClassplainToInstance,您需要进行以下设置:

  • 在所有要设置的属性和类本身上使用@Expose(),在输出类(问题中的DTO类)中。
  • enableImplicitConversion设置为true。
  • 对于数组,例如包含ObjectType对象的数组,在数组上使用@Type(() => ObjectType),例如:public arrayOfObjects: ObjectType[];
英文:

I've found the issue. To use plainToClass or plainToInstance with the option excludeExtraneousValues, you need to set:

  • @Expose() on all properties to set, and on the class itself, in the out class (dto classes in my question)
  • enableImplicitConversion to true
  • @Type(() => ObjectType) for arrays, in the example, an array containing ObjectType objects, ex: public arrayOfObjects: ObjectType[];

huangapple
  • 本文由 发表于 2023年2月8日 19:02:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/75384834.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定