Skip to content

Reimplement Awaited<T> #1085

@ryota-murakami

Description

@ryota-murakami

Reimplement Awaited<T>

TypeScript built-in Utility Type を自前で再実装し、テストを記述して理解を深める。

Original Definition (src/lib/es5.d.ts)

/**
 * Recursively unwraps the "awaited type" of a type.
 * Non-promise "thenables" should resolve to `never`. This emulates the behavior of `await`.
 */
type Awaited<T> = T extends null | undefined
    ? T
    : T extends object & { then(onfulfilled: infer F, ...args: infer _): any }
        ? F extends (value: infer V, ...args: infer _) => any
            ? Awaited<V>
            : never
        : T;

学習ポイント

  • 再帰的な Conditional TypeAwaited<V> で再帰
  • infer の多段活用(F を推論 → V を推論)
  • null | undefined の特別扱い
  • Thenable のインターフェースチェック
  • 最も複雑な ビルトイン Utility Type 🔥

やること

  • packages/types/ に再実装ファイルを作成
  • Vitest の expectTypeOf を使ったテストを記述
  • Promise<string>, Promise<Promise<number>> (ネスト), 非Promise型, null, Thenable のケースをカバー

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions