配列の範囲外アクセスがエラーにならずundefinedになる(TypeScriptでも変わらない)
TypeScriptは配列の要素数を型では追跡しないため、number[]のような型でも範囲外アクセスはコンパイルエラーになりません。実行時もJavaScriptと同じく、静かにundefinedを返します。
なぜエラーが出ないのか
出力: undefined
(エラーなし)- TypeScriptは何も報告しません。型検査も構文も正しいためです
出力: undefined- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 const nums: number[] = [10, 20, 30]; 2 console.log(nums[5]); ^
出力: undefined
nums[5]は範囲外です。TypeScriptもJavaScriptと同じくエラーにはならず、静かにundefinedを返します。
直し方: 5 を 1 にします。
広告
広告スロット(未設定)
パターン2
1 const colors: string[] = ["red", "green", "blue"]; 2 console.log(colors[10]); ^
出力: undefined
配列の長さは3なのでインデックス10は存在しません。例外にはならず、undefinedが出力されます。
直し方: 10 を 2 にします。
パターン3
1 const scores: number[] = [80, 90]; 2 console.log(scores[-1]); ^
出力: undefined
TypeScriptの配列は負のインデックスを末尾からの参照として扱いません。範囲外と同じくundefinedになります。
直し方: -1 を 0 にします。
よくある誤解
「型を付けたのだから範囲外アクセスも検出してくれるはず」という期待は誤りです。TypeScriptの配列型は要素の型だけを表し、長さや添字の妥当性までは追跡しません。
まとめ
配列の範囲外アクセスがエラーにならずundefinedになる(TypeScriptでも変わらない)は初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。
関連するエラー
- 非nullアサーション(!)がコンパイラを騙して実行時エラーになる変数名の後ろに!を付ける非nullアサーションは、「この値はnull/undefinedではない」とコンパイラに約束する構文です。
- 文字列と数値の+の左結合で意図しない連結になる文字列と数値を+で連続してつなげると、最初の+で文字列に変換され、それ以降の+はすべて文字列連結として扱われます。