Oteto Blogのロゴ

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