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

1

参考
  1. static abstract methods and properties · Issue #34516 · microsoft/TypeScript