如何在Typescript中创建抽象工厂模式?

时间:2017-01-23 18:51:12

标签: typescript factory typescript2.0

我正在尝试在Typescript中实现标准的抽象工厂模式,但编译器没有合作。这是我的代码的简化版本:

abstract class Model { }
class User extends Model { }

abstract class ModelFactory<T extends typeof Model> {
   constructor(private modelConstructor: T) {}

   public create(): T {
     return new (this.modelConstructor)();  // ERROR HERE
   }
}
class UserFactory extends ModelFactory<typeof User> {
  constructor() {
    super(User);
  }
}

let user: User;
user  = new UserFactory().create();

但是,当我使用tsc 2.1编译时,我在上面指定的行中收到以下错误:

model.ts(8,13): error TS2511: Cannot create an instance of the abstract class 'Model'.

如果我删除了类型安全性并将该行转换为:

return new (this.modelConstructor as any)();

编译时没有错误。然而,这是不幸的。有没有办法在不使用演员表的情况下使这段代码可编辑?如果没有,为什么不呢?

1 个答案:

答案 0 :(得分:7)

您应该使用此模式:

abstract class ModelFactory<T extends Model> {
    constructor(private modelConstructor: new () => T) { }

    public create(): T {
        return new (this.modelConstructor)();  // OK!
    }
}

class UserFactory extends ModelFactory<User> {
    constructor() {
        super(User);
    }
}