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