我想为我的所有 Axios Api 类(由 OpenAPI 生成器生成)创建一个工厂方法。
因此 Open-API 为我生成了一个 BaseAPI 类,其中包含一个构造函数和十几个 Api 类,这些类扩展了与我的后端控制器相对应的 BaseAPI。
所以我尝试了这个功能:
import { BaseAPI } from "@/api/base";
abstract class AbstractControllerHandler {
protected createApi<T extends typeof BaseAPI>(clazz: T) {
return new clazz(
undefined,
"",
AxiosInstanceHolder.getInstance().getAxiosInstance(),
);
}
其他类使用哪个:
import { CrudCapitalsourceControllerApi } from "@/api";
class CapitalsourceControllerHandler extends AbstractControllerHandler {
private api: CrudCapitalsourceControllerApi;
public constructor() {
super();
this.api = super.createApi(CrudCapitalsourceControllerApi);
}
}
CrudCapitalsourceControllerApi
定义为 class CrudCapitalsourceControllerApi extends BaseAPI
,由 OpenAPI 生成。
我得到一个 ts(2739) 基本上说明
createApi
返回类型 BaseAPI
不能分配给 CrudCapitalsourceControllerApi
类型的变量。
我想我必须为 createApi 指定一个返回类型才能使其工作,但是
T
作为返回类型不起作用。它引发了 ts(2322) 并且我不返回类型而是返回实例...所以知道如何解决这个问题吗?我想我需要一些“instanceof T”作为返回类型声明
我将把您的代码缩短为真正的问题,因为您的代码缺少很多允许我运行它的东西。
class Foo { baseAPI!: true }
class Bar extends Foo { foo!: true }
function createApi<T extends typeof Foo>(clazz: T) {
return new clazz();
}
const bar: Bar = createApi(Bar) // type error because Foo is not assignable to Bar
这里的问题是你实际上并不关心构造函数,你关心它构造了什么。所以 that 应该是你的通用参数
T
。
因此,如果您将
createApi
更改为:
function createApi<T extends Foo>(clazz: new () => T) {
return new clazz();
}
那么你在这里就不会出现类型错误:
const bar: Bar = createApi(Bar) // fine