首页 > 解决方案 > 从泛型类调用类的静态方法

问题描述

我正在使用denodb,一个用于deno. 与 ORM 中的往常一样,模型具有一些静态方法,例如:getfind等。您可以通过创建从 ORM 提供的通用类扩展的类来定义模型。在这种情况下:

import { Model } from "https://raw.githubusercontent.com/eveningkid/denodb/master/mod.ts"
class MyModel extends Model {
  static table = "energy_meter";

  static fields = {
    id: { primaryKey: true, autoIncrement: true },
    someattribute: DataTypes.STRING,
  };
}

这很好用。我的问题如下:我正在尝试为大量以相同方式访问的模型创建通用数据访问(这就是我使用通用类的原因)。为了实现这一点,我使用了以下类:

import { Model } from "https://raw.githubusercontent.com/eveningkid/denodb/master/mod.ts";

export abstract class InventoryDataAccess<E> {
  constructor(public model: Model) {}

  async get(id: number) {
    return ((await this.model.where("id", id).all())[0] as unknown) as E;
  }

  async getAll() {
    return ((await this.model.all()) as unknown) as E[];
  }

}

如您所见,这不起作用,因为model属性是一个实例,而get方法是静态的。实际消息:

This expression is not callable.
  No constituent of type 'Function | FieldValue' is callable.

那是因为getis 不是实例方法,所以它试图找到一个可调用的等价物,但它没有找到。这是模型的实现

所以我想做的是:调用我需要作为变量传递给类的类的静态方法InventoryDataAccess

这甚至可能吗?对于打字稿中的这种情况,还有其他方法可以进行通用数据访问吗?

标签: typescriptgenericsdeno

解决方案


我找到了以下解决方法:

class A {
    public static staticMethod() {
        console.log("It works!");
    }
}

class B extends A {}

class C {
 constructor(public clase: typeof A) {};
 test() {
     this.clase.staticMethod();
 }
}

const c = new C(B);
c.test();

推荐阅读