首页 > 解决方案 > 抽象类中的 Typescript 静态方法来创建 self 的实例

问题描述

假设我有

abstract class Foo {

}

class Bar1 extends Foo {
    constructor(someVar) { ... }
}

class Bar2 extends Foo {
    constructor(someVar) { ... }
}

我希望能够创建一个静态方法来创建最终类的实例(所有构造函数都具有相同的签名)。所以我想要类似的东西:

abstract class Foo {
    public static someAction(someVar) {
        const self = new this(someVar);
    }
}

但这无法做到,因为Foo它是抽象的。这是可能吗?

更新

如果这些类有自己的模板怎么办?

abstract class Foo<M> {

}

class Bar1 extends Foo<SomeModel> {...}

现在我想someAction知道 type SomeModel。我试过

public static someAction<A, T extends Foo<A>>(this: new (someVar: any) => T, someVar: any): T {
    const self = new this(someVar);
    return self;
  }

但是除非我专门做Bar1.someAction<SomeModel>("blah")返回的结果是不可用的数据类型,即Bar1.someAction("blah")不知道数据类型

标签: javascripttypescript

解决方案


this您可以为静态方法的类型添加注释。在这种情况下this将引用类,并为this参数添加注释将使静态方法仅在满足约束的类上可见(在这种情况下,存在具有单个参数的构造函数),它还将帮助我们提取调用该方法的类的实际实例类型:

abstract class Foo {
  public static someAction<T extends Foo>(this: new (someVar: any) => T, someVar: any): T {
    const self = new this(someVar);
    return self;
  }
}

class Bar1 extends Foo {

  constructor(someVar: any) {
    super();
  }
}

class Bar2 extends Foo {
  constructor(someVar: any) {
    super();
  }
}
let bar1 = Bar1.someAction(0) // of type Bar1
let bar2 = Bar2.someAction(0) // of type Bar2

推荐阅读