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);
错误原因解析
- ts(2739)错误:之前直接返回
BaseAPI实例,而父类类型无法赋值给子类变量——TypeScript不允许这种反向赋值,因为子类可能包含父类没有的属性或方法。 - 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
相关产品推荐
相关产品推荐

