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 Type —
Awaited<V> で再帰
infer の多段活用(F を推論 → V を推論)
null | undefined の特別扱い
- Thenable のインターフェースチェック
- 最も複雑な ビルトイン Utility Type 🔥
やること
Reimplement
Awaited<T>TypeScript built-in Utility Type を自前で再実装し、テストを記述して理解を深める。
Original Definition (src/lib/es5.d.ts)
学習ポイント
Awaited<V>で再帰inferの多段活用(Fを推論 →Vを推論)null | undefinedの特別扱いやること
packages/types/に再実装ファイルを作成expectTypeOfを使ったテストを記述Promise<string>,Promise<Promise<number>>(ネスト), 非Promise型,null, Thenable のケースをカバー