Overloads — несколько публичных call signatures над одной implementation signature (её callers не видят). Нужны, когда «эти входные формы → разные выходные типы», но они громоздче и менее честны, чем union или generic — к ним последними.
Перегруженная функция — много контрактов, одно тело. Объявляете 2+ сигнатуры без тела, затем implementation с телом, совместимым со всеми. Callers видят только overloads; implementation invisible — отсюда «почему matching call не type-check'ится».
Core case — input-dependent output types, которые одна сигнатура не выразит: createElement('a') → HTMLAnchorElement, createElement('div') → HTMLDivElement. Union return позволил бы 'div' call типизировать как anchor. Overloads (или generic + conditional/lookup) привязывают каждый input к своему output.
Итог
Overloads = несколько публичных контрактов + скрытая implementation; последний resort перед union/generic.