typescript - 从泛型类调用类的静态方法
问题描述
我正在使用denodb,一个用于deno
. 与 ORM 中的往常一样,模型具有一些静态方法,例如:get
、find
等。您可以通过创建从 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.
那是因为get
is 不是实例方法,所以它试图找到一个可调用的等价物,但它没有找到。这是模型的实现。
所以我想做的是:调用我需要作为变量传递给类的类的静态方法InventoryDataAccess
。
这甚至可能吗?对于打字稿中的这种情况,还有其他方法可以进行通用数据访问吗?
解决方案
我找到了以下解决方法:
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();
推荐阅读
- java - 改进列表列表?
- x86 - PREFETCHT2 读取到什么级别的缓存?
- sml - 如何将一个列表插入另一个列表而不连接它们
- matlab - 如何设置 csvread 的结束限制?
- javascript - 谷歌图表 vAxis 值在第一次点击时不可见
- react-native - 尝试使用 react-native 应用程序在 firebase db 上推送数据,但它没有做任何事情
- ruby-on-rails - 个人资料视图不显示用户名/详细信息
- html - 什么是 c-wiz 标签?
- python - 如果未设置变量,Jinja2 模板渲染 {{variable}} 代替空字符串
- pdf - 根据在 RMarkdown 中编织为 pdf 还是 docx 更改标题级别