[英]How to pass a newable `this` to a static method from a static method?
我如何通过一个newable 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
的实例,但是typescript抱怨这个错误:
类型'typeof Model'的参数不能分配给'new()=> Model'类型的参数。
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);
如果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)
这将使Model
all
不可调用,这可能是你想要的。
编辑
由于在实际使用情况下,你想调用其他静态方法静态方法,我们需要一个稍微复杂的注释this
。 以前的版本只保留构造函数签名而不保留静态成员。 您需要在注释中使用由typeof Model
表示的静态成员。 最简单的方法是在与我们之前定义的构造函数签名的交集中添加typeof Model
( (new () => T)
)基本上将构造函数添加到抽象类。
type NonAbstracModel<T extends Model> = (new () => T) & typeof Model
abstract class Model {
public static convert<T extends Model>(model: NonAbstracModel<T>, data: any | any[]): T { return new model() }
public static all<T extends Model>(this: NonAbstracModel<T>): T {
let items: any[] = []
return Model.convert(this, items)
}
public static find<T extends Model>(this: NonAbstracModel<T>, primaryKey: string | object) { }
public static firstOrFail<T extends Model>(this:NonAbstracModel<T>) {
this.find('abc')
}
}
class A extends Model {}
console.log(A.all(), A.all().constructor.name)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.