0Pricing
TypeScript Academy · レッスン

inferの実践的な用途:Promiseのアンラップ

Promise、Array、独自ラッパーの型をアンラップします。

「inferの実践的な用途:Promiseのアンラップ」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

ラッパー解除の課題

非同期コードを扱うときは、Promiseを受け取り、その内部のTが必要になることがよくあります。inferキーワードを使うと、この取り出し処理を再利用できます。

type Awaited<T> = T extends Promise<infer U> ? U : T;
type A = Awaited<Promise<string>>; // string
type B = Awaited<number>;          // number

組み込みの Awaited ユーティリティ

TypeScript 4.5 では、ネストした promise を再帰的に処理する組み込みのAwaitedが導入されました。

type A = Awaited<Promise<Promise<string>>>; // string
// Handles arbitrary nesting automatically

深さを指定したラッパー解除

Awaited が組み込まれる前は、開発者は infer を使った再帰型で promise のラッパーを解除していました。

type DeepAwaited<T> =
  T extends Promise<infer U> ? DeepAwaited<U> : T;
type A = DeepAwaited<Promise<Promise<number>>>; // number

配列要素のラッパー解除

同じ infer パターンで配列の要素型を取り出せます。これは組み込みのT[number]を使う方法と同等です。

type Element<T> = T extends (infer U)[] ? U : never;
type A = Element<string[]>; // string
type B = Element<number[]>; // number

Observable 型のラッパー解除

RxJS の Observable では、infer を使って発行される型を取り出せます。

type ObservableType<T> = T extends Observable<infer U> ? U : never;
type A = ObservableType<Observable<User>>; // User

関数の戻り値のラッパー解除

ReturnTypeとAwaitedを組み合わせると、非同期関数の解決後の値の型を取得できます。

async function getUser(): Promise<User> { /* ... */ }
type UserResult = Awaited<ReturnType<typeof getUser>>; // User

ネストしたラッパーの解除

infer を連鎖させると、Promise>のように複数の層でラップされた型を処理できます。

type UnwrapPromiseArray<T> =
  T extends Promise<infer U>
    ? U extends (infer V)[]
      ? V
      : U
    : T;
type A = UnwrapPromiseArray<Promise<User[]>>; // User

形状に基づく条件付きのラッパー解除

infer を使うと、特定の型だけを条件付きでラッパー解除し、それ以外の型は変更せずに残せます。

type MaybeUnwrap<T> =
  T extends Promise<infer U> ? U : T extends (infer V)[] ? V : T;

type A = MaybeUnwrap<Promise<string>>;  // string
type B = MaybeUnwrap<number[]>;         // number
type C = MaybeUnwrap<boolean>;          // boolean

型付き API フェッチラッパー

解決後のデータ型を返すジェネリックなフェッチラッパーは、infer によるラッパー解除の典型的な応用例です。

async function fetchData<T>(url: string): Promise<T> {
  const res = await fetch(url);
  return res.json() as T;
}
type UserData = Awaited<ReturnType<typeof fetchData<User>>>; // User

エラーに安全なラッパー解除

Result パターンと infer を組み合わせると、判別共用体から成功時の型を取り出せます。

type Ok<T> = { ok: true; value: T };
type Err = { ok: false; error: string };
type ExtractOk<T> = T extends Ok<infer V> ? V : never;
type A = ExtractOk<Ok<number> | Err>; // number

復習: infer によるラッパー解除

infer キーワードは、Promise、配列、Observable、Result 型などのラッパーから型を取り出すための万能ツールです。組み込みのAwaitedは非同期処理のラッパー解除に対応し、それ以外の構造にはカスタム型を使用します。

確認問題

非同期関数の解決後の値の型を取得する最適な方法は何ですか。

学んだこと

infer によるラッパー解除は、実践的な TypeScript の非同期コード向けのツールです。promise には組み込みのAwaitedを使用し、配列、Observable、Result パターンにはカスタムのラッパー解除型を作成してください。

よくある質問

「inferの実践的な用途:Promiseのアンラップ」レッスンは無料ですか?

はい。「inferの実践的な用途:Promiseのアンラップ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「inferの実践的な用途:Promiseのアンラップ」で何を学びますか?

Promise、Array、独自ラッパーの型をアンラップします。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「inferの実践的な用途:Promiseのアンラップ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 条件型のinferを理解する
  2. ReturnTypeとParametersをゼロから構築する
  3. 深くネストした推論パターン
  4. inferの実践的な用途:Promiseのアンラップ
← TypeScript Academyに戻る