Noh | エンジニア向け情報共有コミュニティ
Signup / Login

TSで配列のn番目を取得したときの推定にはundefinedが入らない理由

typescript

投稿日: 2025/03/31

GPTの回答
.atは普通に知らなかった。

TypeScript では、配列の n 番目の要素を取得すると undefined になる可能性がありますが、それでも型推論では undefined が含まれないのは、TypeScript の型システムの設計によるものです。

理由 1: TypeScript は「配列は要素が存在する」と仮定する

TypeScript は、array[n] の型を T[] 型から推論するときに、基本的に「n は有効なインデックスである」と仮定します。
例えば、次のコードでは numbers[2] の型は number になります。

const numbers = [1, 2, 3]; // 型は number[] const value = numbers[2]; // 推論結果: number

これは TypeScript の型推論が「通常、配列の有効なインデックスを使う」ケースを想定しているためです。
numbers[100]undefined ですが、これは実行時の動作であり、型推論には影響しません。


理由 2: undefined を含めると不便になる

もし TypeScript が numbers[n] の型を number | undefined と常に推論すると、すべての配列アクセス時に undefined の可能性を考慮する必要があり、過剰な型安全チェックが求められることになります。

const numbers = [1, 2, 3]; const value: number | undefined = numbers[2]; // 厳密にはこうなるべき? if (value !== undefined) { console.log(value.toFixed(2)); // OK } else { console.log('Value is undefined'); }

しかし、通常の配列アクセスでは undefined になることは例外的なケースであり、多くの場合、開発者が手動でチェックする方が合理的です。


理由 3: 厳密に undefined を考慮するには at() を使う

TypeScript 4.9 以降では、配列の at() メソッドを使うと undefined を含む型が推論されます。

const numbers = [1, 2, 3]; const value = numbers.at(5); // 推論結果: number | undefined

これは、at()undefined を返すことを明示的に考慮しているためです。
通常の array[n] のアクセスは「範囲内のアクセスが前提」とされているため、undefined を含みません。


結論

  • array[n] の型推論では undefined を含めないのが TypeScript のデフォルト仕様。
  • すべてのアクセスに undefined を考慮すると使い勝手が悪くなるため。
  • at() を使えば undefined を含む型推論になるため、厳密に扱いたい場合は at() を使うのが推奨される。

つまり、「実行時には undefined になる可能性がある」ことと、「型システムが undefined を含めるかどうか」は別問題 ということですね。

yosi

Noh を作ってるエンジニア。

目次