如何将可更新的this
从静态方法传递给静态方法?
abstract class Model {
public static convert<T extends Model>(model: new () => T, data: any | any[]) {
return new model()
}
public static all<T extends Model>(): Promise<[]> {
let items: any[] = []
return Model.convert(this, items)
// ^--- Error is here
}
}
生成的JavaScript有效,我得到了A
的实例,但是打字稿抱怨此错误:
类型'typeof Model'的参数不能分配给'new()=>模型'类型的参数。
class Model {
static convert(model, data) { return new model() }
static all() {
let items = [];
return Model.convert(this, items);
}
}
class A extends Model { }
console.log(A.all(), A.all().constructor.name);
答案 0 :(得分:3)
如果Integrated Security = true
不是Model
,这通常会起作用。如果abstract
不是抽象的Model
(键入为this
)将具有typeof Model
构造函数,但是由于它是抽象的,因此它没有可调用的构造函数。
简单的解决方案是在静态方法中为new () => Model
添加注释:
this
这将使abstract class Model {
public static convert<T extends Model>(model: new () => T, data: any | any[]): T[] { return null!; }
public static all<T extends Model>(this: new () => T): Promise<T[]> {
let items: any[] = []
return Promise.resolve(Model.convert(this, items));
}
}
class A extends Model { }
console.log(Model.all()) // err since Model does not have a ctor
console.log(A.all(), A.all().constructor.name)
无法调用all
,这可能仍然是您想要的。
修改
由于在您的实际用例中,您想从其他静态方法中调用静态方法,因此我们需要为Model
稍微添加一些复杂的注释。以前的版本仅保留构造函数签名,并且不保留任何静态成员。您需要在批注中用this
表示的静态成员。最简单的方法是在与我们先前定义的构造函数签名(typeof Model
)相交处添加typeof Model
,基本上是在抽象类中添加构造函数。
(new () => T)