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