instanceof instanceof によるナローイング

最終更新:2026-10-22

instanceof instanceof によるナローイング

instanceof ガードは「クラス」のユニオンに使えます。ある値があるクラスのインスタンスかどうかを調べ、そうであれば TS はその型をそのクラスへナローイングます。JS のプロトタイプチェーンによる実行時の実際の判定に基づくもので、Date、Map、Error、独自クラスを含むユニオンを扱う標準的な道具です。

グループナローイングとアサーション
種類演算子
strict モード不要

ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。

📝 構文

function logValue(x: Date | string) {
  if (x instanceof Date) {
    console.log(x.toISOString());  // x: Date
  } else {
    console.log(x.toUpperCase());  // x: string
  }
}

⚙️ パラメータ

instanceof Klass実行時にプロトタイプチェーンをたどり、Klass.prototype がオブジェクトのプロトタイプに現れるかを調べます。TS は同時に型を Klass(またはそのサブクラス)へナローイングます

戻り値:instanceof 式は boolean を返します。ナローイングはコンパイル時に起こり、instanceof の右辺には prototype を持つコンストラクタが必要です。

▶ サンプル

下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:

出力:

Article: TS Basics
Video: 95s

(トランスパイル後の実行出力。item.title や item.duration が型チェックを通るのは、instanceof によるナローイングが効いているからです。ナローイングは tsc が静的に保証し、実行時に見えるのは値だけです)

💡 ポイント

ℹ️ 説明 instanceof は実行時の実際のチェック(プロトタイプチェーンの検査)なので、JSON.parse で復元された「形だけ似た」オブジェクトには効果がありません。それらのプロトタイプはあなたのクラスではなく Object.prototype です。
⚠️ 注意 instanceof は interface には使えません。インターフェースはコンパイル後に存在せず、検査できるコンストラクタがないためです。インターフェースの形を区別するには in、カスタム型ガード、判別可能ユニオンを使いましょう。
💡 ヒント iframe 間や vm 間で受け渡されたオブジェクトは、現在のグローバルのクラスとプロトタイプが異なるため、instanceof が誤って false を返すことがあります。この種の境界データはカスタム型ガードで構造的に検証するのがおすすめです。
ケースは今後追加予定です。

📚 関連チュートリアル

❓ よくある質問

Q instanceof はサブクラスも絞り込めますか?
A できます。instanceof はプロトタイプチェーンをたどるため、サブクラスのインスタンスは instanceof 親クラス でも true になり、逆に 親クラスのインスタンス instanceof 子クラス は false になります。TS のナローイングも継承関係を考慮します。
Q JSON.parse の結果に instanceof を使うと常に false になるのはなぜですか?
A JSON.parse が生成するのは普通のオブジェクトで、プロトタイプは Object.prototype であり、あなたが定義したクラスのプロトタイプは含まれません。構造を判定するにはカスタム型ガード(x is T)でフィールドごとに検証しましょう。
Q instanceof と typeof、どちらを選ぶべきですか?
A プリミティブ型(string/number/boolean など)には typeof、クラスのインスタンス(Date、Map、独自クラス)には instanceof を使います。どちらも実行時の実際のチェックで、組み合わせて使えます。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%