Advanced TypeScript
Conditional Types
Conditional types choose one type or another based on assignability. They are the foundation for many TypeScript utility types and library-level type transformations.
- Conditional types are type-level branches
inferextracts part of a type- Naked type parameters distribute over unions
- They are best for reusable type helpers
- Type cleverness has maintenance cost
type AwaitedValue<T> = T extends Promise<infer U> ? U : T
type A = AwaitedValue<Promise<string>> // string
type B = AwaitedValue<number> // numbertype OnlyStrings<T> = T extends string ? T : never
type Result = OnlyStrings<string | number | "ok">
// string | "ok" simplifies to string| Piece | Meaning |
|---|---|
| T extends U | Assignability test |
| ? A : B | Type-level branch |
| infer X | Capture part of matched type |
| never | Remove impossible union branch |
| [T] extends [U] | Prevent distributive behavior |