2016-12-11 3 views
5

私は静的属性を持つ抽象クラスModelと、別の汎用クラスController<T extends Model>を持っています。私はコントローラのインスタンスでModelの静的属性にアクセスしたいと思います。それは次のようにする必要がありますTypescriptアクセスジェネリック型の静的属性

abstract class Model{ 
    static hasStatus: boolean = false; 
} 

class MyModel extends Model{ 
    static hasStatus = true; 
} 

class Controller<T extends Model>{ 
    constructor(){ 
     if(T.hasStatus)... 
    } 
} 

をしかし、TSは、これを達成する簡単な方法があります'T' only refers to a type, but is being used as a value here.

言いますか?または、各遺産ModelのサブクラスControllerと値を取得するメソッドを実装する必要がありますか?

+0

'コントローラ 'を作成するときに' T'はどのようにバインドされますか? –

答えて

3

タイプスクリプトでこれを行う方法はありません。汎用型のパラメータは、宣言で型が表示される場所にのみ表示され、実行時にはアクセスできません。その理由は簡単です。ジェネリッククラスのメソッドごとに1つのjavascript関数が生成され、ジェネリック型パラメータとして渡された実際の型をその関数が知る方法はありません。

あなたは、実行時にその情報が必要な場合、あなたはそれを呼び出すときに、自分自身をコンストラクタにパラメータを追加して型を渡す必要があります:ここで

class Controller<T extends Model>{ 
    constructor(cls: typeof Model){ 
     if (cls.hasStatus) { 
     } 
    } 
} 

let c = new Controller<MyModel>(MyModel); 

はJavaScriptにコンパイルされたときに、それはポイントを説明するためにどのように見えるかです - ここには汎用パラメータが残っておらず、clsパラメータを削除すると、hasStatusがどこから来るべきかに関する情報はありません。

var Controller = (function() { 
    function Controller(cls) { 
     if (cls.hasStatus) { 
     } 
    } 
    return Controller; 
}()); 
var c = new Controller(MyModel); 
関連する問題