TypeScript/非同期/Lesson 04
async / await — 戻り値の型を明示すると呼び出し元が自動推論される
30分·theory
このチャプター
4/7
TypeScript
async / await — 戻り値の型を明示すると呼び出し元が自動推論される
💡 なぜ学ぶべきか? — async関数のシグネチャはそのまま契約書
🎯
JSのasync関数は、戻り値の型を知るために関数本体をすべて読まなければなりません。
💼
TSのasync関数は、シグネチャに`Promise`のように明記しておけば、呼び出し側は本体を読まなくても安全に使用できます。
⚡
`await`の結果の型は自動的に推論されます — 一度明記した型はawaitチェーンの末端まで伝播します。
🔗
try/catchの`err`はTS 4.4以降`unknown`です。`.message`にアクセスするには`instanceof Error`のような型の絞り込みが必要です。
🏢 실무에서는
Next.jsのServer Component、Server Action、API Routeハンドラはすべてasync関数です。戻り値の型を明示することで、その関数をimportして使用するクライアント・サーバー両方の箇所でIDEが引数と戻り値を提示します。明示しない場合、`as User`のような強制キャストがコードベース全体に積み重なっていきます。
async関数 = 常にPromiseを返す、await = 展開する
1. async関数の戻り値の型は自動的にPromiseでラップされる
- ▸
asyncが付いた関数は常にPromiseを返します。 - ▸戻り値の型は
Promise<...>の形式でなければなりません(それ以外の型をシグネチャに書くとコンパイルエラーになります)。 - ▸本体で
return valueすると、自動的にPromise.resolve(value)としてラップされます。 - ▸本体で
throw errすると、自動的にPromise.reject(err)になります。
2. awaitの結果は自動推論される
3. catchのerrはunknown(TS 4.4+)
4. Promiseを返す関数とasync関数は等価
好みで使い分けられますが、本体の中で await を使いたい場合は async が必須です。
💡 💡 async/await TypeScriptの要点5選
1. async関数の戻り値の型はシグネチャに明示する
シグネチャを見るだけで呼び出し元が意図を理解できます。
2. awaitの結果は推論に任せてもOK
明示すると可読性が上がりますが、省略しても安全です。
3. errはunknown — 絞り込んで使う
tsconfig の useUnknownInCatchVariables: true はTS 4.4+ strictモードのデフォルト設定です。
4. async関数の中でPromiseを二重にラップしない
5. Promise.allの結果はタプルで受け取る(promiseレッスン済み)
⚡ 実際に試してみよう — async/await
型を取り除いた実行可能バージョンです。awaitによる順次処理とtry/catchによるエラーハンドリングを確認しましょう。
✏️ JS 코드
📟 コンソール出力
▶ 実行ボタンを押してください
⚠️ ブラウザのサンドボックスで実行 — console.log()のみ対応、alert/fetchは不可
確認クイズ
TS 4.4+において `try { ... } catch (err) { console.log(err.message); }` がコンパイルエラーになる理由は?
先に読むとよい概念: Promise<T> — JS vs TS の違い