Компромиссы
- Default для всего со state — fetch results, form status, WebSocket connection, reducer actions. Несколько
boolean или optional «только вместе валидные» поля → discriminated union.
- Exhaustiveness — killer feature — трюк с
never превращает «забыл case» в build failure; Redux actions почти всегда tagged unions.
- Когда не надо: члены почти одинаковы, отличие минимально — один object с optional полем проще; union near-identical shapes = boilerplate. Огромный union (десятки членов) может тормозить narrowing.
- Interop cost: внешний JSON часто приходит как flag-bag; переводите в union на границе (хорошее место для validator).
Итог
Tagged unions — default для state-моделей; exhaustiveness стоит boilerplate; на границе API — mapping/validation.