带有 typeof 参数的函数返回给定类型的实例

问题描述 投票:0回答:1

我想为我的所有 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”作为返回类型声明

typescript axios openapi-generator
1个回答
0
投票

我将把您的代码缩短为真正的问题,因为您的代码缺少很多允许我运行它的东西。

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

见广场

© www.soinside.com 2019 - 2024. All rights reserved.