Nest.js DTO转换:如何从同一嵌套对象暴露多个字段
问题原因
你当前的实现无效,核心问题是两个属性drivetrain和engineSize都通过@Expose({name: 'car'})映射到了输出的同一个字段car,class-transformer处理时会出现字段覆盖,最终只保留了第一个转换后的结果(也就是drivetrain的值"4WD")。
解决方案
根据你想要的输出结构,有两种常用解决方式:
方式1:保留嵌套的car结构
通过定义嵌套DTO来明确car下需要保留的字段,让class-transformer自动处理嵌套转换:
1.1 创建CarDTO
import { Expose } from 'class-transformer'; export class CarDTO { @Expose() drivetrain: string; @Expose() engineSize: string; }
1.2 主DTO中引用嵌套DTO
import { Expose, Type } from 'class-transformer'; import { CarDTO } from './car.dto'; export class VehicleDTO { @Expose() @Type(() => CarDTO) // 指定嵌套类型,确保转换逻辑生效 car: CarDTO; // 若不需要trailer字段,可添加@Exclude()或直接不声明该属性 }
转换后输出结果:
{ "car": { "drivetrain": "4WD", "engineSize": "2.0L" } }
方式2:将字段平级输出(不保留car嵌套)
如果希望把drivetrain和engineSize作为根级字段返回,可通过Transform从原始对象的car属性中直接提取值,无需给两个属性指定相同的@Expose(name):
import { Expose, Transform } from 'class-transformer'; export class VehicleDTO { @Expose() @Transform(({ obj }) => obj.car.drivetrain) // 从原始对象的car字段提取drivetrain drivetrain: string; @Expose() @Transform(({ obj }) => obj.car.engineSize) // 从原始对象的car字段提取engineSize engineSize: string; }
转换后输出结果:
{ "drivetrain": "4WD", "engineSize": "2.0L" }
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

