2016-09-10 2 views
1

私が抱えていること:基本クラスの静的メソッドから子クラスの新しいインスタンスを返します

子クラスの新しいオブジェクトを返すことができるBaseクラスが必要です。

のような:

export class Base { 
    constructor() { 
    } 

    static query() { 
     //return a new object of class from which this function is called. 
    } 

} 

export class Child extends Base { 

} 

私IndexComponentクラスで

export class IndexComponent { 
var user = Child.query() // By this I have a new object of Child class in user variable 
} 

事前にありがとうございます!

答えて

2

解決策は単純である:

export class Base { 
    constructor() {} 

    static query() { 
     return new this(); 
    } 
} 

let base = Base.query(); // Base {} 
let child = Child.query(); // Child {} 

code in playground

静的関数を実行するときにthisがコンストラクタ関数であるので、これは動作します。
コンパイル済みのjsであることがわかります。

var Base = (function() { 
    function Base() { 
    } 
    Base.query = function() { 
     return new this(); 
    }; 
    return Base; 
}()); 

query機能がBaseコンストラクタ関数のプロパティであり、そしてそれはBaseを拡張するためにもChildの財産になります。

ここでの問題は、このquery関数を入力して、コンパイラが返される型がわかるようにすることです。

let base = Base.query(); // here base is of type 'Base' 
let child: Child = Child.query(); // need to declare the type 
// or 
let child2 = Child.query() as Child; // or assert it 

私は誰もがアイデアを持っているかどうかを知りたいと思って、返される正しい型推論コンパイラを作るための方法を考えることはできません。今、あなたがこれを行う必要がありますについては

+0

ありがとうございます。子クラスのオブジェクトをコンソール化することができました。 –

+0

ありがとうございます。私も同様の状況ですが、私の基底クラスは抽象クラスであり、コンパイラはこのエラーを返します: 'エラーTS2511:抽象クラスのインスタンスを作成できません。 'これをどうすれば処理できますか? 'abstract'キーワードを削除すると正しく動作します。 –

+0

詳細はこちら:https://github.com/Microsoft/TypeScript/issues/5863 –

関連する問題