2017-01-23 53 views
2

我試圖在Typescript中實現一個標準的抽象工廠模式,但是編譯器不是合作的。這裏是我的代碼的簡化版本:如何在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)(); 

代碼編譯時沒有錯誤。但是,這是不幸的。有沒有什麼辦法可以在不使用cast的情況下編譯這些代碼?如果不是,爲什麼不呢?

回答

4

你應該使用這種模式:

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); 
    } 
} 
+0

不錯!不知道那種語法。 –