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

NestJS自定义Swagger响应装饰器导致所有接口返回类型被覆盖问题

问题根因

Swagger生成接口文档时,会以响应类的类名作为Schema的唯一识别标识。你当前mapResponse方法里返回的动态类统一命名为Response,所有接口的响应类都会被Swagger判定为同一个Schema,最后加载的模块的类型自然就会覆盖掉之前所有同名称Schema的定义。

修复方案

给动态生成的响应类设置和业务数据类型绑定的唯一类名即可,修改mapResponse函数如下:

const mapResponse = <T>(type: T) => {
  // 生成唯一类名,兼容数组、自定义类、基础类型三种场景
  let typeName: string;
  if (Array.isArray(type)) {
    typeName = `${type[0].name}List`;
  } else if (typeof type === 'function') {
    typeName = type.name;
  } else {
    typeName = String(type);
  }
  const className = `${typeName}Response`;

  // 动态创建带唯一类名的响应类
  const ResponseClass = {
    [className]: class extends BaseResponse {
      @ApiProperty({ type })
      data: T;
    }
  }[className];

  return ResponseClass;
};

修改后重启项目即可生效,如果你还封装了Post、Put等其他请求方法的自定义装饰器,不需要额外修改,改mapResponse这一处就可以全局解决类型覆盖问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:06:04