Programmingフロントエンド開発者 / TypeScript 開発者

TypeScriptにおける配列とタプルの厳密な型付けはどのように実現され、なぜ使用されるのか?その違いや使用時の注意点は何か?

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

回答

TypeScriptでは、配列をtype[]またはArray<type>の記法で要素の型を指定することにより、厳密に型付けすることができます。例えば:

let arr: number[] = [1, 2, 3];

タプルとは、固定長の配列であり、各要素の型を定義したものです:

let tuple: [string, number] = ["age", 30];
  • 配列:同じ型の要素を任意の数だけ許可します。
  • タプル:型の数と順序を厳密に固定します。レコードのような構造を作成したり、異なる型の値を関数から返すことを可能にします。

注意点:

  • 配列メソッド(push、pop)をタプルに使用すると、pushは禁じられていませんが、結果は保証された型付けの範囲を超えることになります。
  • タプルを慎重に拡張すると、「安全でない」コードにつながります。
  • 関数内でのタプルの分割代入:不正確な型や長さを指定するとエラーが発生します。

出題の意図

TypeScriptのタプルは可変長の要素を含むことができ、型付けにどのように影響しますか?

回答: はい、タプルは...構文を使用して残りの要素を含めることができますが、残りの要素の型は依然として厳密に指定する必要があります:

let tuple: [string, ...number[]] = ["id", 10, 20, 30];

ただし、...より前の要素は必ず指定しなければならず、残りの配列の型は単一である必要があります。

このテーマの微妙な点について知らなかったことによる実際のエラーの例


物語

eコマースプロジェクトで、開発者はpushを使用してタプル[string, number]に二つ以上の要素を保存しようとしました。これはコンパイル時にエラーにならなかったが、正確に二つの要素を期待していた関数の動作を壊し、注文解析時のエラーを引き起こしました。


物語

関数はタプル[string, number]を返しましたが、消費者は文字列の配列を期待していました。型の不一致により、捕捉しにくいエラーが発生し、不正確な値が本番環境に送信されました。


物語

JavaScriptからTypeScriptへのコードの移行時に、異なる型の複数の値を返すために配列を使用しました。これが厳密な型付けを乱し、値の順序と型に依存していた後続のコードにバグを引き起こしました。