如何从静态方法将可更新的`this`传递给静态方法?

时间:2019-08-08 20:36:46

标签: javascript typescript

如何将可更新的this从静态方法传递给静态方法?

TypeScript Playground

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);

1 个答案:

答案 0 :(得分:3)

如果Integrated Security = true不是Model,这通常会起作用。如果abstract不是抽象的Model(键入为this)将具有typeof Model构造函数,但是由于它是抽象的,因此它没有可调用的构造函数。

简单的解决方案是在静态方法中为new () => Model添加注释:

this

Play

这将使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)