Можно ли сделать перегрузку функции с помощью типа?

Да, в TypeScript можно реализовать перегрузку функции с помощью типов.

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

Для создания перегруженной функции в 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 arguments");
  }
}

В данном примере определены две сигнатуры функции sum, одна с типами number, и вторая с типами string. Затем, после определения сигнатур, следует объявление самой функции. Здесь мы используем объединение типов (number | string) для параметров и результата, чтобы учитывать оба варианта вызова функции.

Когда мы вызываем функцию sum, компилятор TypeScript будет анализировать типы аргументов и выбирать соответствующую сигнатуру функции. Например:

console.log(sum(10, 20)); // Выводит: 30
console.log(sum("Hello, ", "world!")); // Выводит: Hello, world!

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

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