TypeScript/非同期/Lesson 01
同期 vs 非同期 — TypeScript はコールバックのシグネチャまで保護する
25分·theory
このチャプター
1/7
TypeScript
4.
同期 vs 非同期 — TypeScript はコールバックのシグネチャまで保護する
💡 なぜ学ぶべきか? — 同期・非同期は同じでも、安全網が違う
🎯
同期・非同期のランタイム動作は JS と TS で同じです — 違いは「コールバックや戻り値の型を誰が保証するか」という点にあります。
💼
JS では `setTimeout(cb, 1000)` の `cb` がどんな引数を受け取るか分かりません。TS ではコールバックシグネチャを型として固定できます。
⚡
非同期関数が何を返すか (`Promise` なのか `Promise` なのか) をシグネチャに明記しておくと、呼び出し側コードで自動補完が効くようになります。
🔗
Node.js とブラウザでは `setTimeout` の戻り値の型が異なります (`NodeJS.Timeout` vs `number`) — TS は環境ごとに正確に推論します。
🏢 실무에서는
イベントハンドラ・タイマー・API 呼び出しはすべてコールバックを受け取ります。JS ではコールバック内で `e.target.value` と書くつもりが `e.target.valeu` とタイプミスしても、ランタイムになって初めて発覚します。TS では `(e: React.ChangeEvent) => void` のように型を付けることで、IDE の自動補完・タイプミス防止・構造変更の自動追跡をすべて提供します。
同期・非同期の動作は同じでも、コールバックの型が違う
1. ランタイムの動作は同一
TS でも JS でも、この動作は同じです。TypeScript はコンパイル後に型を取り除いて JavaScript として実行されるからです。
2. 違いは「コールバック・戻り値の型」の明示
3. 非同期関数の戻り値の型を固定する
4. setTimeout の戻り値は環境によって異なる — 1つのコードは1つの環境でしか安全でない
> 💡 ライブラリや汎用モジュールを作る際は必ず ReturnType<typeof setTimeout> を使いましょう。環境が確定しているアプリコードでのみ number や NodeJS.Timeout を直接書いても構いません。
💡 💡 JS と TS の核心的な違い(同期/非同期)
1. コールバックを受け取る関数は、コールバックのシグネチャを引数の型に埋め込む
2. 非同期関数はシグネチャに戻り値の型を明示する
3. タイマー ID は ReturnType<typeof setTimeout> で受け取る
ブラウザは number、Node は NodeJS.Timeout を返しますが、これで環境に関係なく安全です。
4. 非同期の結果をそのまま any に流さないres.json() のデフォルト戻り値は Promise<any> です。キャストするか zod などのバリデーションで絞り込むか、境界で型を固定することが重要です。
5. コールバック地獄の答えは JS・TS どちらも同じ:async/await
TypeScript は async/await の型推論をより強力にサポートします。これは Promise のレッスンで扱った内容です。
⚡ 実際に試してみよう — 同期 vs 非同期
上記の 🅱️ TS コードから型を取り除いた実行可能バージョンです。動作自体は JS と TS で同一であることを確認します。
✏️ JS 코드
📟 コンソール出力
▶ 実行ボタンを押してください
⚠️ ブラウザのサンドボックスで実行 — console.log()のみ対応、alert/fetchは不可
確認クイズ
TypeScript でブラウザと Node.js の両方の環境で安全にタイマー ID を受け取るには、どうすれば良いですか?
先に読むとよい概念: TypeScript 最小基礎 — 型エラーの読み方・any の回避
次のおすすめ: イベントループ — Microtask vs Macrotask