TypeScript/非同期/Lesson 03
Promise<T> — TypeScript で非同期を型安全に
30分·theory
このチャプター
3/7
TypeScript
Promise
Promise
Promise
Promise — TypeScript で非同期を型安全に
💡 なぜ学ぶべきか — JS Promise の一歩先へ
🎯
JS の Promise は `.then(user => ...)` の中で `user` が何であるかを知りません — IDE の自動補完はなく、タイポはランタイムになって初めて爆発します。
💼
TS の `Promise` は「中に入る値の型」を `T` の位置に固定します — IDE が事前に教えてくれ、誤った使い方はコンパイル時に拒否されます。
⚡
実務の API 関数の 90% が Promise を返します。型が固定された Promise は呼び出し側コードの信頼性を決定します。
🔗
`async/await` や `Promise.all` といったツールも、型が固定されて初めて真の価値が生まれます(`Promise.all` はタプル型まで推論します)。
🏢 실무에서는
Next.js や React の Server Component、Server Action、API ルートはすべて `async` 関数です。戻り値の型を明示しないと、呼び出し側で毎回 `as User` のような強制キャストが発生し、それが積み重なると型システムが意味を失います。実務では `Promise`、`Promise`、`Promise` のように戻り値の型を明示することが基本です。
Promise — ジェネリクスで「格納される値」の型を固定する
Promise の T とは何か
JS Promise は「後から届く値を約束するオブジェクト」です。TS Promise
T を固定すると何が変わるか
JS であれば pizza.toFixed(2) はコンパイルを通過 → 実行時に TypeError → テストが運よく捕まえるか、運悪ければプロダクションで発生します。
async 関数の戻り値の型は自動的に Promise でラップされる
async キーワードが付いた関数は必ず Promise を返します。 そのため戻り値の型には Promise<...> と書く必要があります(または推論に任せます)。
明示的な型 vs. 推論
実務では両方使います:
Promise.all はタプル型まで推論する
JS では結果の配列を受け取っても各要素の型は不明です。TS は各位置の型を保持します。
💡 💡 JS ↔ TS の核心的な違い
1. new Promise() には必ず <T> を固定せよ
2. async 関数の戻り値の型は明示したほうがよい
公開 API 関数はシグネチャを見るだけで意図が伝わるべきです。
3. Promise.all の結果はタプルで受け取れ
4. catch のエラーは unknown (TS 4.4+)
5. ジェネリクスのヘルパーは一度書けば永続的に使える
⚡ 実際に試してみよう — Promise (型を取り除いた実行バージョン)
上の 🅱️ TS コードから**型注釈だけを取り除いた実行可能バージョン**です。実行時の動作は同じです — 違いは IDE がミスを捕まえるかどうか、それとも実行時に発覚するかどうかです。
💡 本物の TS コンパイラで試したい場合は → 上の 🅱️ コードを [TypeScript Playground](https://www.typescriptlang.org/play) に貼り付けてください。
✏️ JS 코드
📟 コンソール出力
▶ 実行ボタンを押してください
⚠️ ブラウザのサンドボックスで実行 — console.log()のみ対応、alert/fetchは不可
確認クイズ
TypeScript において `Promise<User>` の `<User>` が意味するものは何ですか?
先に読むとよい概念: イベントループ — Microtask vs Macrotask