NestJS > TypeORM 将复杂实体映射到复杂的 DTO
NestJS > TypeORM Mapping complex entities to complex DTOs
我正在使用 class-transformer > plainToClass
(entity, DTO) 将实体映射到 DTO
我还实现了 here 中描述的相关 transform.interceptor 模式。
然后我对 DTO 的成员使用 @Expose()
。这很好用,但我有一个限制,我需要在我的父 DTO 中映射成员 DTO,但这并没有发生,请参见下面的简单示例
@Exclude()
export class ParentDTO{
@Expose()
pMember2 : string;
@Expose()
pMember2 : ChildDto[];
}
@Exclude()
export class ChildDTO{
@Expose()
cMember2 : string;
}
export class ParentEntity{
pMember1 : number;
pMember2 : string;
pMember3 : string;
pMember4
: Child[];
}
export class ChildEntity{
cMember1 : number;
cMember2 : string;
cMember3 : string;
}
现在如果我 运行 plainToClass(parentEntityFromDB, ParentDTO)
我希望得到以下内容
ParentDTO{
pMember2 : string;
pMember2 : ChildDto[];
}
然而,我得到的是
ParentDTO{
pMember2 : string;
pMember2 : Child[]; //Including all original members
}
基本上 plainToClass(entity, DTO) 不会自动映射成员以匹配给定的 DTO 类型。
有没有办法做到这一点,或者这是方法的局限性??
谢谢
您必须使用 @Type
:
指定嵌套类型
@Exclude()
export class ParentDTO{
@Expose()
pMember2 : string;
@Expose()
@Type(() => ChildDto)
pMember2 : ChildDto[];
}
使用 @Type
装饰器,class-transformer 在调用 plainToClass
时为给定的 属性 实例化一个 class。否则,嵌套的 属性 将保持为普通 javascript 对象,因此您的 @Exclude
将不会被使用。
我正在使用 class-transformer > plainToClass
(entity, DTO) 将实体映射到 DTO
我还实现了 here 中描述的相关 transform.interceptor 模式。
然后我对 DTO 的成员使用 @Expose()
。这很好用,但我有一个限制,我需要在我的父 DTO 中映射成员 DTO,但这并没有发生,请参见下面的简单示例
@Exclude()
export class ParentDTO{
@Expose()
pMember2 : string;
@Expose()
pMember2 : ChildDto[];
}
@Exclude()
export class ChildDTO{
@Expose()
cMember2 : string;
}
export class ParentEntity{
pMember1 : number;
pMember2 : string;
pMember3 : string;
pMember4
: Child[];
}
export class ChildEntity{
cMember1 : number;
cMember2 : string;
cMember3 : string;
}
现在如果我 运行 plainToClass(parentEntityFromDB, ParentDTO)
我希望得到以下内容
ParentDTO{
pMember2 : string;
pMember2 : ChildDto[];
}
然而,我得到的是
ParentDTO{
pMember2 : string;
pMember2 : Child[]; //Including all original members
}
基本上 plainToClass(entity, DTO) 不会自动映射成员以匹配给定的 DTO 类型。
有没有办法做到这一点,或者这是方法的局限性??
谢谢
您必须使用 @Type
:
@Exclude()
export class ParentDTO{
@Expose()
pMember2 : string;
@Expose()
@Type(() => ChildDto)
pMember2 : ChildDto[];
}
使用 @Type
装饰器,class-transformer 在调用 plainToClass
时为给定的 属性 实例化一个 class。否则,嵌套的 属性 将保持为普通 javascript 对象,因此您的 @Exclude
将不会被使用。