Периодически забываю про альтернативный синтаксис для перегрузки функций в Typescript, поэтому напишу тут, чтобы не искать-вспоминать, когда понадобится.

В документации описан вот такой вариант:

function position(): number; // получить позицию
function position(index: number): void; // установить позицию

function position(index?: number): number | void {
  if (index == undefined) {
    return 22;
  }
  updatePosition(index);
}

Однако, в интерфейсах так может быть не удобно писать, т.к. приходится дублировать имя функции, и запросто можно при рефакторинге переименовать одну и забыть переименовать другую. Особенно прикольно, что совершенно не обязательно они должны быть написаны рядом:

interface I {
    position(): number; // получить позицию
    // много строк кода
    position(index: number): void; // установить позицию
}

Но есть вариант описать атрибут как вызываемый (callable), тогда имя дублировать не нужно, и можно записать всю конструкцию в одну строку:

interface I {
    position: { (): number; (index: number): void }; // получить/установить позицию
}