Public fieldsとは何か
JavaScriptのクラス構文において、コンストラクタ内でthis.prop = valueと記述する代わりに、クラス直下に直接プロパティを宣言できる「Public class fields」。一見すると記述が簡潔になるだけの糖衣構文に見えますが、実務においては「初期化の明示」という大きなメリットがあります。
コンストラクタの肥大化を防ぐ
多くの現場で見かけるのが、コンストラクタ内で膨大な初期化ロジックが並ぶコードです。Public fieldsを活用することで、クラスのプロパティを宣言と同時に初期化できるため、コンストラクタを「依存関係の注入」や「最低限の初期設定」だけに集中させることができます。
例えば、Reactのクラスコンポーネントや、複雑な状態を持つサービス層のクラスにおいて、プロパティの存在がクラス定義の先頭で一目でわかることは、コードの可読性を劇的に向上させます。
実行時の順序に注意する
ここで実務上の注意点があります。Public fieldsの初期化は、コンストラクタの実行前に行われます。これは、親クラスのコンストラクタ(super)を呼ぶ前にフィールドが評価されることを意味します。
もし、初期化ロジックの中で親クラスから継承したメソッドを呼び出そうとすると、undefinedエラーが発生する可能性があります。この挙動は従来の「コンストラクタ内で全て初期化する」パターンとは異なるため、クラスの継承関係が深い設計を行う際は、Public fieldsによる宣言的初期化と、コンストラクタ内での動的初期化を使い分ける判断力が求められます。
実務でのベストプラクティス
私の経験上、全てのプロパティをPublic fieldsで書く必要はありません。以下のような使い分けが推奨されます。
1. 初期値が固定である場合や、即時計算可能な値はPublic fieldsで宣言する。
2. 外部からの引数に依存して初期化が必要な場合は、コンストラクタで初期化する。
こうすることで、「何がクラスのデフォルト状態なのか」が宣言部で明らかになり、後からコードを読むメンバーがクラスの構造を即座に把握できるようになります。新しい構文を単に「短く書くため」に使うのではなく、「コードの意図をどこに置くか」という設計視点で活用することが、長期的な保守性を高める鍵となります。