【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プロパティを参照する場合や型安全性を求める場合は、ジェネリクスで子クラスの型を渡すのが良さそう。