Как типизировать зависимость вывода функции от типа аргумента?

Для типизации зависимости вывода функции от типа аргумента в TypeScript можно использовать перегрузку функций.

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

Давайте рассмотрим пример. Предположим, у нас есть функция hello, которая принимает аргумент типа string и возвращает строку "Hello, {arg}!", где {arg} - значение переданного аргумента. Однако, если аргумент имеет тип number, мы хотели бы, чтобы функция возвращала строку "Sorry, numbers are not allowed!".

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

function hello(arg: string): string;
function hello(arg: number): string;

function hello(arg: string | number): string {
  if (typeof arg === 'string') {
    return `Hello, ${arg}!`;
  } else {
    return "Sorry, numbers are not allowed!";
  }
}

В этом примере мы определили две сигнатуры функции для разных типов аргумента. Первая сигнатура принимает аргумент типа string и возвращает значение типа string. Вторая сигнатура принимает аргумент типа number и также возвращает значение типа string.

Затем мы определяем основную реализацию функции, которая принимает аргумент типа string | number. Внутри этой реализации мы проверяем тип аргумента с помощью оператора typeof и возвращаем соответствующее значение в зависимости от типа.

Теперь TypeScript автоматически выберет правильную сигнатуру функции на основе переданных аргументов. Например:

console.log(hello("TypeScript")); // Выводит "Hello, TypeScript!"
console.log(hello(10)); // Выводит "Sorry, numbers are not allowed!"

В результате, если аргумент имеет тип string, функция hello вернет приветственное сообщение, а если аргумент имеет тип number, функция вернет сообщение об ошибке. Это позволяет нам типизировать вывод функции в зависимости от типа аргумента.