Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

TypeError: Cannot read propertyの意味と回避術【初心者向け】

2

はじめに

JavaScriptを使っていて、こんなエラーに遭遇したことはありませんか?

TypeError: Cannot read property 'xxx' of undefined

まさに「あるある」ですよね。 画面が真っ白になり、何が起きたのか分からず、コンソールにはこの見慣れた(けれど意味不明な)メッセージ。

特に、フロントエンドの開発やAPIとの連携をしているときに多発するこのエラーは、初心者〜中級エンジニアにとって避けがたい壁です。

本記事では、このエラーの原因と仕組みをわかりやすく解説したうえで、

  • どこでつまずきやすいのか

  • どうすれば未然に防げるのか

を実務目線で丁寧に整理していきます。


Cannot read property ‘xxx’ of undefined とは?基礎から理解する仕組みと原因

このエラーは「未定義(undefined)のオブジェクトに対してプロパティを読み取ろうとした」ときに発生します。 つまり、undefined.property のようなコードが存在するとき、JavaScriptはそのオブジェクトがそもそも存在していないため、プロパティアクセスができずに TypeError を返すのです。

そもそも undefined とは?

JavaScriptにおいて、undefined は「変数は宣言されたが値が代入されていない」状態、または「存在しないプロパティにアクセスしようとしたとき」に現れます。

let user;
console.log(user.name); // TypeError: Cannot read property 'name' of undefined

この場合、user には何も代入されていない(undefined)のに、その name プロパティを参照しようとしているため、エラーが発生しています。

よくある原因とその背景

  1. APIレスポンスの中身が未定義

    • 非同期通信後にデータが取得できていないまま描画処理を行うケース

    • ネットワーク遅延やAPI仕様のミスが原因の場合も

  2. オブジェクトのネスト構造への過信

    • 例:data.user.profile.name のような深い参照は、どれか一つが undefined ならエラーになります

  3. 初期化処理の漏れ

    • state = {} のように空の初期化はしていても、階層構造までは初期化されていないことが多い

  4. イベント発火タイミングのズレ

    • DOMがまだ構築されていないうちに参照しているパターンなど

可視化で理解する|処理の流れ

function handleData(response) {
  // responseがundefinedだった場合にエラーになる
  console.log(response.user.name);
}

このコードで重要なのは、response が確実に存在し、user がオブジェクトであることを保証しない限り、.name の参照は非常に危険だという点です。


よくあるつまずきと、実務で役立つ回避テクニック集(Optional Chaining/Nullish Coalescing活用)

ここでは、実際の現場で「TypeError: Cannot read property ‘xxx’ of undefined」が発生しやすい典型パターンを紹介し、そのうえで、どう書き換えるべきか、何を確認すべきかを具体的に解説します。

ケース1:APIレスポンスが遅れて未定義のまま描画される

NGコード(Before)

function renderUserInfo(data) {
  // データが未定義でもアクセスしてしまう
  console.log(data.user.name);
}

OKコード(After)

function renderUserInfo(data) {
  if (data && data.user && data.user.name) {
    console.log(data.user.name);
  } else {
    console.log("ユーザー情報が未取得です");
  }
}
// → nullチェックを加えることで安全にアクセスできるようになった

補足:optional chainingを使うと簡潔に記述可能

console.log(data?.user?.name ?? "ユーザー情報が未取得です");

ケース2:初期状態のstateでプロパティにアクセスしてしまう(React)

NGコード(Before)

const [user, setUser] = useState();
return <p>{user.name}</p>; // エラーになる

OKコード(After)

const [user, setUser] = useState({});
return <p>{user?.name ?? "名前未設定"}</p>;
// → 初期値と ?? によるフォールバックでエラーを回避

ケース3:mapやforEachで不完全な要素にアクセス

items.forEach(item => {
  if (item?.value) {
    console.log(item.value);
  }
});
// → 各要素の存在を保証しないまま処理するリスクを回避

よくある質問:

Q. undefinedをチェックするたびにif文を書くのは冗長では?
A. ?. や ?? を活用することで、冗長さを最小限に抑えつつ安全なコードを書くことが可能です。構造が深くなるほど、その恩恵は大きくなります。


まとめと次に進むためのステップ

ここまで「TypeError: Cannot read property ‘xxx’ of undefined」について、原因の理解から具体的な回避方法まで、実務視点で幅広く解説してきました。

要点をおさらいすると:

  • このエラーは「undefinedな値に対してプロパティを読もうとする」ことが原因

  • APIレスポンス、オブジェクトのネスト構造、初期化の抜けなどが主なトリガー

  • if 条件による存在チェックや ?.(optional chaining)を活用することで、安全なコードに改善可能

  • 冗長なif文は ??(nullish coalescing)と組み合わせることで読みやすく整理できる

今後のおすすめステップ

このエラーはJavaScriptに慣れるうえで誰もが通る道です。 「エラーを見て原因を想像し、適切に分岐処理を加える」という流れを繰り返すことで、確実にレベルアップしていきます。

以下のアクションを次の学習ステップとしておすすめします。

JavaScriptのエラーと正しく向き合うことは、開発者としての大きな成長につながります。焦らず、確実に原因を追い、コードに反映する習慣をつけていきましょう。

【外部リンク】

【内部リンク】

RANKINGranking-icon

LATEST POSTS

もっとルートゼロを知りたいなら

DISCOVER MORE