英文:
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
中使用plainToClass
或plainToInstance
,您需要进行以下设置:
- 在所有要设置的属性和类本身上使用
@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 containingObjectType
objects, ex:public arrayOfObjects: ObjectType[];
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论