Для типизации зависимости вывода функции от типа аргумента в 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
, функция вернет сообщение об ошибке. Это позволяет нам типизировать вывод функции в зависимости от типа аргумента.