TypeScript/非同期/Lesson 05
Fetch API — レスポンス型を固定するジェネリックヘルパーパターン
30分·theory
このチャプター
5/7
TypeScript
2. 最もよくあるパターン —
Fetch API — レスポンス型を固定するジェネリックヘルパーパターン
💡 なぜ学ぶべきか?— fetchはanyが漏れ続ける入口
🎯
`fetch().then(r => r.json())` の結果はデフォルトで `Promise` です。型システムが機能しなくなる箇所です。
💼
TypeScript ではジェネリックヘルパー `fetchJson()` を一度作成するだけで、すべての API 呼び出しの結果を安全な型として流すことができます。
⚡
ランタイム検証(zod・valibot)と組み合わせることで、外部データが本当にその型であるかどうかまで保証できます。
🔗
エラーレスポンス(`!res.ok`)、ネットワークエラー、パースエラー — この 3 つを分けて扱うのが実務のパターンです。
🏢 실무에서는
Next.js の Server Component でも `await fetch()` が中心になります。同じデータの形をあちこちで使い回すため、一度定義した `User`・`Post` インターフェースが fetch の結果からコンポーネントの props まで一貫して流れる必要があります。fetch の入口で型を固定しなければ、その一貫性が崩れてしまいます。
Response · res.json() · ジェネリックヘルパー
1. Responseの型はわかるが、bodyはany
2. 最もよくあるパターン — as Promise<User>
シンプルですが嘘をつく可能性があります — サーバーが突然異なる形状を返してもコンパイルは通ります。小さなプロジェクトなら問題なし。
3. ジェネリックヘルパー — 再利用可能、キャストを一箇所に集約
4. 本当に安全 — ランタイム検証との組み合わせ
ランタイムで実際の形状を検証するため嘘がつけません。外部APIとの通信時に推奨。
💡 💡 fetch + TS 実務パターン5選
1. プロジェクトごとにfetchJson
fetchの入口を一箇所に集めると、キャッシング・ロギング・エラーポリシーを一元管理できます。
2. as Promise
外部APIならzodのようなランタイム検証で形状確認が安全です。
3. HttpErrorのようなカスタムエラーでstatusを保持
statusに応じた異なるUI処理が可能 (401 → ログイン、403 → 権限案内)。
4. RequestInitは標準型 — TSが知っている
5. Next.jsのfetchはキャッシュオプションを受け取る
標準fetchのRequestInitをNext.jsが拡張し、型も合わせて拡張されます。
⚡ 実際に試してみよう — fetchJsonヘルパー (モック)
実際のfetchは外部呼び出しになるためモック化しています。ヘルパーの流れだけを体感します。
✏️ JS 코드
📟 コンソール出力
▶ 実行ボタンを押してください
⚠️ ブラウザのサンドボックスで実行 — console.log()のみ対応、alert/fetchは不可
確認クイズ
`async function fetchJson<T>(url: string): Promise<T> { ... return res.json() as Promise<T>; }`の弱点は何ですか?
先に読むとよい概念: async / await — 戻り値の型と err: unknown
次のおすすめ: エラー処理 — catch の unknown を絞り込む