Компромиссы
- Constrain до minimum capability, которую реально используете.
<T extends { length: number }> лучше <T extends string[]> — over-constraining теряет structural flexibility без выгоды.
- Defaults — ergonomics win (
Map, useState()), но default, тихо прикрывающий inference failure, прячет bug — call выглядит typed, пока T silently стал fallback.
- Не используйте constraint как documentation.
<T extends unknown> / <T extends object> без использования members — шум.
Итог
Минимальный constraint, осторожность с defaults, не плодите бессмысленные extends.