2017-01-23 3 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)(); 

コードはエラーなしでコンパイルされます。しかし、これは残念です。キャストを使用せずにこのコードをコンパイル可能にする方法はありますか?そうでない場合は、どうしてですか?

答えて

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

ニースを!その構文について知らなかった。 –

関連する問題