【TypeScript】abstract classにstaticプロパティを定義しインスタンスから参照する
abstract class A { abstract static readonly CONST: string; // => Abstract properties can only appear within an abstract class.}
上記のようにstaticプロパティにabstract
修飾子を付けることはできずエラーになってしまう。
解決法
abstract class A { static readonly CONST: string;}
class B extends A { static readonly CONST = '';
static foo() { return this.CONST; }
bar() { return (this.constructor as typeof B).CONST; }}
- 継承元で
abstract
修飾子を使わず、継承先Classで初期化する- 継承先Classで初期化し忘れてもコンパイルエラーにならないのが若干ネック
- インスタンスからstaticプロパティを参照する場合は
this.constructor.XXX
とする
abstract class A< T extends typeof A = typeof A,> { static readonly CONST: string;
foo() { return (this.constructor as T).CONST; }}
class B extends A<typeof B> { ...}
もしabstract class側でstaticプロパティを参照する場合や型安全性を求める場合は、ジェネリクスで子クラスの型を渡すのが良さそう。
参考