You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:57:22