intermediate
Discriminated unions
Конечные автоматы, варианты API, exhaustive switch и невозможные состояния.
Discriminated union даёт каждому variant общий literal discriminant вроде `kind` или `status`. Switch по этому полю сужает payload. Это моделирует request states, domain events, command results и workflows, где impossible combinations не должны compile.
type State =
| { status: 'loading' }
| { status: 'success'; data: string }
| { status: 'error'; error: Error };
Exhaustive handling через `never` в default branch. Если discriminant расширяется до `string`, narrowing теряет силу.
На интервью: объясните, почему union лучше одного object с множеством optional state fields.
Типовые ошибки: путать похожие API и забывать edge cases в live coding.
Компромисс часто между ясностью и безопасностью или expressiveness и maintainability. Чеклист:
- Stable discriminant.
- Exhaustive switches.
- Избегайте wide string discriminants.