В этом руководстве вы узнаете о перегрузке функций в TypeScript.
Введение
В TypeScript перегрузки функций позволяют установить связь между типами параметров и типами результатов функции.
Обратите внимание, что перегрузки функций TypeScript отличаются от перегрузок функций, поддерживаемых другими языками со статической типизацией, такими как C# и Java.
Начнем с простых функций:
function addNumbers(a: number, b: number): number { return a + b; } function addStrings(a: string, b: string): string { return a + b; }
В этом примере:
- Функция
addNumbers()
возвращает сумму двух чисел. - Функция
addStrings()
возвращает объединение двух строк.
Можно использовать тип объединения для определения диапазона типов параметров и результатов функции:
function add(a: number | string, b: number | string): number | string { if(typeof a === 'number' && typeof b === 'number') return a + b; if(typeof a === 'string' && typeof b === 'string') return a + b; }
Однако тип объединения не точно выражает связь между типами параметров и результатами.
Функция add()
сообщает компилятору, что он будет принимать числа или строки и возвращать число или строку. В нем не описано, что функция возвращает число, когда параметры являются числами, и возвращает строку, если параметры являются строками.
Чтобы лучше описать отношения между типами, используемыми функцией, TypeScript поддерживает перегрузку функций. Например:
function add(a: number, b: number): number; function add(a: string, b: string): string; function add(a: any, b: any): any { return a + b; }
В этом примере мы добавили две перегрузки функции add()
. Первая перегрузка сообщает компилятору, что если аргументы являются числами, функция add()
должна возвращать число. Вторая перегрузка делает то же самое, но для строки.
Каждая перегрузка функции определяет комбинацию типов, поддерживаемых add()
. Она описывает сопоставление между параметрами и результатом, который они возвращают.
Теперь, когда вы вызываете функцию add()
, редактор кода предлагает доступную функцию перегрузки, как показано на следующем рисунке:
Перегрузка функций с необязательными параметрами
Когда вы перегружаете функцию, количество обязательных параметров должно быть одинаковым. Если у перегрузки больше параметров, чем у другой, необходимо сделать дополнительные параметры необязательными. Например:
function sum(a: number, b: number): number; function sum(a: number, b: number, c: number): number; function sum(a: number, b: number, c?: number): number { if(c) return a + b + c; return a + b; }
Функция sum()
принимает два или три числа. Третий параметр является необязательным. Если вы не сделаете его необязательным, вы получите сообщение об ошибке.
Перегрузка метода
Когда функция является свойством класса, она называется методом. TypeScript также поддерживает перегрузку методов. Например:
Функция count()
может возвращать число или массив в зависимости от количества переданных ей аргументов:
let counter = new Counter(); console.log(counter.count()); // return a number console.log(counter.count(20)); // return an array
Выход:
1 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]
Заключение
Перегрузки функций TypeScript позволяют описывать взаимосвязь между типами параметров и результатами функции.