TSで配列のn番目を取得したときの推定にはundefinedが入らない理由
投稿日: 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 を含めるかどうか」は別問題 ということですね。
