使用此在孩子的抽象类中创建实例

时间:2019-08-07 21:54:01

标签: javascript typescript

我有一个做new this()的抽象类,但是,它不是在创建自身的实例,而是在创建扩展它的类的实例。

这在编译时在JavaScript中有效,并返回适当的类。但是,TypeScript在抱怨。

  

无法创建抽象类的实例。

abstract class Model {
  static find<T extends Model>(someVar) {
    let inst = new this() as T
    // Do some extra stuff with the instance
    return inst
  }
}

class A extends Model { }

A.find()

1 个答案:

答案 0 :(得分:0)

解决方案的第一个问题-不安全,T类型可能不包含空构造函数。第二个问题:即使您未在find()类上调用A,如果未明确设置返回类型,则返回类型将被推断为Model

由于无论如何在调用find时都应指定A类型,因此最好将类型构造函数传递给find方法,在这种情况下,两个问题都将得到解决。

abstract class Model {
  static find<T extends Model>(ModelClass: new () => T, param: string): T {
    let inst = new ModelClass()
    // Do some extra stuff with the instance
    return inst;
  }
}

class A extends Model {}
const a = Model.find(A, "param");