ウェブサイト検索

TypeScriptで静的クラスを参照すること


次のような状況があります。基底クラス(register)で静的メソッドを定義できるようにしたいです。このメソッドは、オーバーライドされるべき他の静的プロパティへの参照を使用します。例えば:

class Base {
    constructor() { }
    public static name = "Override me please";
    public static register = function() { console.log( Base.name ) }
}

class Child extends Base {
    constructor() { super() }
    public static name = "Child";
}

そしてもちろん、Child.register() に 'Child' を出力させたいです。現在のクラスへの参照を取得することは可能でしょうか?クラスへの参照を常に渡すことはできますが、クラスを直接参照できる方がよりエレガントに思えます。

どんな助けでも感謝します!ありがとうございます!

回答 #1

こちらは、あなたが求めているようなことを実行する実装です。

class Base {
    constructor() { }
    public static aname = "Override me please";
    public static register = function() { console.log( this.aname ) }
}

class Child extends Base {
    constructor() { super() }
    public static aname = "ChildName";
}

注意すべきことが2つあります。

  1. JavaScript の this バインディングの仕組み。Child.register() を呼び出すと、this は基本的に . の左側にあるものを指します。この「static」なコンテキストでは、this は生成された JavaScript の「コンストラクタ」関数を指し、TypeScript では「クラス」を意味します。

  2. JavaScript において this が関数を指すため、name は関数の標準属性であり、プロパティの名前はおそらく変更する必要があります(ただし、function.name に関する MDN のドキュメントによると、これは標準ではない場合があります)。Child.name="Child" の値を設定していることが、この問題を覆い隠している可能性があります。

回答 #2

すべてのJavaScript関数のprototypeに利用可能であり、したがってインスタンスの__proto__でも利用できるconstructorプロパティを使用できます:

class Base {
    constructor() { }
    public static name = "Override me please";
    public static register = function() { console.log( Base.name ) }
}

class Child extends Base {
    constructor() { 
        super();
        console.log(this.constructor['name']); // use local version
     }
    public static name = "Child";
}

var child = new Child();