Компромиссы
- Overloads — last resort. Generic с constraint/lookup (
on<K extends keyof Events>) или single union signature честнее и DRY. Overloads дублируют сигнатуры и дают implementation drift.
- Genuinely necessary, когда input values выбирают unrelated output types без indexable relationship — DOM
createElement, API где fn(true) и fn(false) возвращают разные shapes.
- Optional/default/rest закрывают многие «нужны две сигнатуры».
(a: number, b?: number) лучше двух overloads, если разница только в arity.
- Method overloads в interfaces — как типизирован DOM lib; читать полезно, писать редко.
Итог
Prefer generics/lookup; overloads — когда value-driven unrelated outputs; optional params часто заменяют пару overloads.