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

TypeScript中OpenAPI生成Axios API类工厂方法类型错误修复咨询

解决方案

核心思路

让工厂方法接收API类的构造函数作为参数,通过TypeScript的InstanceType<T>工具类型推导返回的实例类型,既能保证类型安全,又能正确返回对应子类的实例。

正确的工厂函数实现

假设OpenAPI生成的基础结构如下(和你实际生成的代码对齐):

// OpenAPI生成的BaseAPI
class BaseAPI {
  constructor(protected axios: AxiosInstance) {}
}

// OpenAPI生成的子类API
class CrudCapitalsourceControllerApi extends BaseAPI {
  // 生成的接口方法...
}

工厂函数写法如下:

import { AxiosInstance } from 'axios';
import { BaseAPI } from './path-to-generated-api';

function createApi<T extends typeof BaseAPI>(
  apiConstructor: T,
  axiosInstance: AxiosInstance
): InstanceType<T> {
  return new apiConstructor(axiosInstance) as InstanceType<T>;
}

调用示例

import axios from 'axios';
import { CrudCapitalsourceControllerApi } from './path-to-generated-api';

const axiosInstance = axios.create({ baseURL: 'https://your-api-domain.com' });
// 返回实例的类型自动推导为CrudCapitalsourceControllerApi
const capitalsourceApi = createApi(CrudCapitalsourceControllerApi, axiosInstance);

错误原因解析

  1. ts(2739)错误:之前直接返回BaseAPI实例,而父类类型无法赋值给子类变量——TypeScript不允许这种反向赋值,因为子类可能包含父类没有的属性或方法。
  2. ts(2322)错误:如果指定返回类型为T,T是构造函数的类型(比如typeof CrudCapitalsourceControllerApi),但实际返回的是实例,两者类型不匹配。InstanceType<T>工具类型专门用于提取构造函数对应的实例类型,刚好解决这个问题。

扩展:适配多参数构造函数

如果OpenAPI生成的BaseAPI构造函数还有其他参数(比如配置对象),只需要同步扩展工厂函数的参数列表即可:

function createApi<T extends typeof BaseAPI>(
  apiConstructor: T,
  axiosInstance: AxiosInstance,
  ...restArgs: ConstructorParameters<T>
): InstanceType<T> {
  return new apiConstructor(axiosInstance, ...restArgs) as InstanceType<T>;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:43:18