contextual 文脈的型付け

最終更新:2026-10-22

contextual 文脈的型付け

文脈的型付け:関数リテラルが「型が既知の位置」(変数注釈、配列メソッドのコールバック、イベントハンドラ)に現れると、TS はそのパラメータ型を逆算します——注釈を手書きする必要はありません。map((o) => o.id) の o に型が付くのは、関数自体からの推論ではなく、配列の要素型という「文脈」から来ています。

グループ関数とクラス
種類構文
strict モード不要

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

📝 構文

const orders: Order[] = [];

// コールバック引数 o は orders の要素型から文脈型 Order を得る
const summaries = orders.map((o) => `#${o.id}: ${o.total}`);

// 変数への注釈も文脈を提供する
type ClickHandler = (event: { x: number; y: number }) => void;
const onClick: ClickHandler = (event) => console.log(event.x, event.y);

⚙️ パラメータ

const x: T = ...文脈的推論が発動する場面:変数やパラメータの型注釈、配列の要素、関数の実引数(仮引数の型に対応)、return 式(宣言された戻り値型に対して)
(x) => ...注釈のないコールバックパラメータは文脈から型を受け取ります。明示的な注釈を書く場合は文脈と互換でなければエラーになります

戻り値:return 式も同じく文脈の制約を受けます。宣言された戻り値型が各 return を逆方向から検査し、「分岐の return を1つ書き忘れた」ようなミスを早期に捕まえます。

▶ サンプル

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

出力:

#101: 250, #102: 90, #103: 480
2
click @ 12,34

(トランスパイル後の実行出力。コールバック内で o.pric(打ち間違えたプロパティ名)と書くと即座にコンパイルエラーになります——文脈の型が許さないためです)

💡 ポイント

ℹ️ 説明 文脈的推論は「外から内へ」の型の流れで、通常の推論(式から変数へ)と方向が逆です。両者が同時に存在する場合、明示的な注釈を持つ側が勝ちます。
💡 ヒント コールバックパラメータに「暗黙の any」と赤線が出るのは、たいてい文脈が欠けている(配列に型が付いていない)せいです。コールバックに注釈を足すのではなく、外側の型を先に直しましょう。
⚠️ 注意 React の onChange={(e) => ...} のようなコールバックは文脈の型に依存します。useCallback で包むなどして別途切り出したら、型注釈は自分で補う必要があります。そうしないとパラメータは any に落ちます。
ケースは今後追加予定です。

❓ よくある質問

Q 文脈的型付けと型推論は同じものですか?
A 違います。通常の推論は「値から型へ」(const x = 5 → number)。文脈的型付けは「位置から値へ」——まず目標の型が分かっていて、関数リテラルのパラメータ型がそこから逆向きに流れます。コールバックパラメータの型はほぼすべて後者から来ます。
Q map のコールバックパラメータが any になるのはなぜですか?
A 配列自体に型がないためです(JSON.parse 由来や注釈漏れなど)。文脈から借りられる型がなく、コールバックパラメータは暗黙の any になります。配列に要素型を注釈すれば直ります。
Q 文脈的型付けはエラーを「見逃し」ますか?
A まったく逆です——文脈的型付けは検査の根拠です。文脈の型に存在しないプロパティにコールバック内でアクセスすると即座にエラーになります(余分なフィールドも同じ)。プロパティ名の打ち間違いを防げるのはまさにこのためです。
Web-Tutorial.com

Web-Tutorial 技術チーム

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

100%