Programmingフルスタック開発者

TypeScriptでオーバーロードされたクラスコンストラクタをどのように実装し、型付けするのか?なぜ複数のconstructorメソッドを単に指定できないのか、そしてそれを正しく実現する方法は?

Hintsage AIアシスタントで面接を突破

答え。

TypeScriptは、他の多くのオブジェクト指向プログラミング言語で可能なように、1つのクラス内でのコンストラクタ本体の複数の宣言をサポートしていません。代わりに、複数のコンストラクタシグネチャ(オーバーロード)を宣言し、その後、引数を手動で解析する統一されたコンストラクタ本体を実装することができます:

class User { name: string; age: number; constructor(name: string); constructor(name: string, age: number); constructor(name: string, age?: number) { this.name = name; this.age = age ?? 18; } } const u1 = new User('Alice'); // age = 18 const u2 = new User('Bob', 32); // age = 32

重要な詳細:

  • クラス内で実装の上に複数のシグネチャを指定できますが、コンストラクタの実装は1つだけ許可されています。
  • コンストラクタの実装は、すべてのオーバーロードバリエーションと互換性がなければなりません。
  • TypeScriptは、引数のオーバーロードに対する一致を自動的にチェックします。

だましの質問。

「このようにコンストラクタを実装できますか?」

undefined

class Test { constructor(x: number) {} constructor(x: string) {} }


**正しい答え:** いいえ、そのコードはエラーを引き起こします:「Duplicate constructor implementation」。TypeScriptでは、コンストラクタの本体の実装は1つだけ許可され、オーバーロードはシグネチャ形式で定義される必要があります(本体なし)。

### このテーマの詳細を知らないための実際のエラーの例。

---
> 物語

プロジェクトでは、異なるパラメータを持つ2つのコンストラクタを持つクラスを実装しようとしましたが、Javaの経験をコピーしました。その結果、TypeScriptはコンパイルエラーを投げ、プロジェクトはビルドできず、急いでシグネチャのオーバーロードにリファクタリングする必要がありました。

---
> 物語

チームの1人がオーバーロードを持つクラスのコンストラクタを書きましたが、オプションのパラメータを考慮するのを忘れ(undefinedを処理していませんでした)、結果として存在しない値にアクセスしようとし、最小限の引数でインスタンスを作成する際にクラッシュが発生しました。

---
> 物語

コンストラクタのオーバーロードが宣言されましたが、コンストラクタの本体が呼び出しの説明されたバリエーションと一致していませんでした。あるケースでは、必ず第2引数が必要でしたが、シグネチャではオプションでした。このような矛盾はすぐに明らかにはなりませんでしたが、ユニットテストを書いている際に浮上し、デバッグを困難にしました。