繁体   English   中英

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

[英]How to pass a newable `this` to a static method from a static method?

我如何通过一个newable 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的实例,但是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM