Как нормально перегрузить функцию?

В TypeScript существует возможность перегрузки функций, то есть определить несколько вариантов вызова функции с различным количеством и типами аргументов. Это достигается с помощью объявления перегруженных сигнатур функции перед самой реализацией.

Предположим, что у нас есть функция sum, которая должна складывать два числа или конкатенировать две строки. Мы можем перегрузить эту функцию следующим образом:

function sum(a: number, b: number): number;
function sum(a: string, b: string): string;

function sum(a: number | string, b: number | string): number | string {
  if (typeof a === 'number' && typeof b === 'number') {
    return a + b;
  } else if (typeof a === 'string' && typeof b === 'string') {
    return a + b;
  } else {
    throw new Error('Invalid argument types for sum function');
  }
}

В приведенном примере мы объявляем две перегруженные сигнатуры функции sum, одну для числовых аргументов и одну для строковых аргументов. После перегруженных сигнатур следует реализация функции sum. Когда вызывается функция sum, TypeScript будет использовать подходящую перегруженную сигнатуру в зависимости от переданных аргументов.

Например, если мы вызываем sum(2, 3), TypeScript выберет первую перегруженную сигнатуру и вернет число 5. А если мы вызываем sum('Hello', ' World'), TypeScript выберет вторую перегруженную сигнатуру и вернет строку 'Hello World'.

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

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