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

使用class-transformer暴露嵌套对象数组时返回空对象如何解决

NestJS class-transformer 嵌套数组序列化空对象解决方案

问题根因

TypeScript的类型注解仅在编译期生效,运行时class-transformer无法识别Array<mock>中声明的元素类型,处理数组元素时不会按照mock类的规则做序列化。你开启了excludeExtraneousValues: true配置,该配置会过滤所有未在当前序列化类上标记@Expose的字段,数组元素的字段不属于外层UserDto的暴露字段,因此被全部过滤,最终返回空对象。

解决步骤

  • 从class-transformer中导入@Type装饰器,为嵌套数组字段指定运行时转换的类,让class-transformer识别数组元素的序列化规则
  • (可选)将已废弃的plainToClass方法替换为新版plainToInstance,兼容后续class-transformer版本迭代

修正后代码

Dto定义

import { Expose, Type } from 'class-transformer';

// 类名首字母大写符合TypeScript命名规范
class Mock {
  @Expose() id : string;
  @Expose() createdAt : Date;
  @Expose() updatedAt : Date;
}

export class UserDto {
  @Expose()
  id : string;
  
  @Expose()
  userName : string;
  
  @Expose()
  email : string;

  @Expose()
  bio : string;

  @Expose()
  avatar : string;

  @Expose()
  followerCount : number;

  @Expose()
  followeeCount : number;

  @Expose()
  verified : boolean;

  @Expose()
  @Type(() => Mock)
  followers : Array<Mock>;

  @Expose()
  @Type(() => Mock)
  followees : Array<Mock>;
}

序列化拦截器(可选优化)

import { plainToInstance } from 'class-transformer';

export function Serialize(dto: ClassConstructor) {
  return UseInterceptors(new Serializeinterceptor(dto));
}

export class Serializeinterceptor implements NestInterceptor {
  constructor(private dto: any) {}

  intercept(context: ExecutionContext, handler: CallHandler) {
    return handler.handle().pipe(
      map((data: any) => {
        return plainToInstance(this.dto, data, {
          excludeExtraneousValues: true,
        });
      }),
    );
  }
}

内容的提问来源于stack exchange,提问作者rickster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 13:24:03