nestjs-swagger生成typescript-axios客户端代码泛型异常求助
泛型生成异常问题可行解决方案
方案1:调整NestJS侧泛型Schema定义
核心是给泛型包装类生成的实例显式指定唯一类名,避免swagger生成匿名object类型的schema:
- 修改你的泛型包装工厂函数,显式设置生成类的name属性:
// 原PaginatedResponse泛型工厂调整 export function PaginatedResponse<T>(dto: ClassType<T>) { class PaginatedOfSpecificDto extends PaginatedDto { @ApiProperty({ type: [dto] }) items: T[]; } // 关键配置:给生成的泛型实例类设置唯一可识别的名称 Object.defineProperty(PaginatedOfSpecificDto, 'name', { value: `PaginatedResponseOf${dto.name}` }); return PaginatedOfSpecificDto; }
- 接口返回注解直接传入生成好的具体类型即可:
@Get() @ApiOkResponse({ type: PaginatedResponse(CreateCatDto) }) findAll() { // 业务逻辑实现 }
调整后重新生成OpenAPI规范,会自动生成名为PaginatedResponseOfCreateCatDto的独立Schema,不会出现泛型合并为交叉类型的问题。
方案2:新增openapi-generator生成参数
在原生成命令中添加泛型支持相关的附加参数,完整命令如下:
openapi-generator-cli generate -g typescript-axios -i specFile.json -o . --additional-properties=useGenericResponse=true,modelPropertyNaming=original,supportsES6=true
参数useGenericResponse=true会强制生成器识别Schema中的泛型关联关系,不会将未匹配的泛型参数自动合并为object交叉类型。
方案3:中间层修正OpenAPI规范
如果前两种方案仍不生效,可以在生成OpenAPI规范之后、生成客户端代码之前,写一个简易的Node脚本遍历规范中的Schema定义,将所有PaginatedDto & object的引用替换为对应实际泛型实例Schema的引用,再执行客户端生成命令即可。
内容的提问来源于stack exchange,提问作者optimus
相关产品推荐
相关产品推荐

