0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы научимся использовать перегрузки функций.</p>
1
<p>В этом уроке мы научимся использовать перегрузки функций.</p>
2
<h2>Использование перегрузки функций</h2>
2
<h2>Использование перегрузки функций</h2>
3
<p><strong>Перегрузка функций</strong>- это возможность определить несколько версий одной функции, каждая из которых принимает свой набор параметров. Разберем на примере:</p>
3
<p><strong>Перегрузка функций</strong>- это возможность определить несколько версий одной функции, каждая из которых принимает свой набор параметров. Разберем на примере:</p>
4
<p>Здесь определяется одна функция concat(). У нее две версии, которые выполняют конкатенацию, но делают это по-разному:</p>
4
<p>Здесь определяется одна функция concat(). У нее две версии, которые выполняют конкатенацию, но делают это по-разному:</p>
5
<ul><li>Первая версия - принимает на вход два числа. У чисел сначала отбрасывается дробная часть, потом они конкатенируются</li>
5
<ul><li>Первая версия - принимает на вход два числа. У чисел сначала отбрасывается дробная часть, потом они конкатенируются</li>
6
<li>Вторая версия - принимает на вход две строки. Строки конкатенируются сразу</li>
6
<li>Вторая версия - принимает на вход две строки. Строки конкатенируются сразу</li>
7
</ul><p>Реализация поведения для обеих версий делается в третьей функции с тем же именем. При этом описание параметров должно подходить под каждую версию функции. В примере выше типы параметров определены как unknown. Это дает возможность вызывать функцию как со строками, так и с числами.</p>
7
</ul><p>Реализация поведения для обеих версий делается в третьей функции с тем же именем. При этом описание параметров должно подходить под каждую версию функции. В примере выше типы параметров определены как unknown. Это дает возможность вызывать функцию как со строками, так и с числами.</p>
8
<p>То, по какой ветке идти, определяется с помощью проверки типов. В примере выше достаточно проверить тип только первого параметра, потому что второй в таком случае точно будет строкой. Это обеспечивает система типов и компилятор.</p>
8
<p>То, по какой ветке идти, определяется с помощью проверки типов. В примере выше достаточно проверить тип только первого параметра, потому что второй в таком случае точно будет строкой. Это обеспечивает система типов и компилятор.</p>
9
<p>Для перегрузки необязательно использовать объявление функций. То же самое можно сделать с помощью стрелочной функции:</p>
9
<p>Для перегрузки необязательно использовать объявление функций. То же самое можно сделать с помощью стрелочной функции:</p>
10
<p>В этом случае не обязательно явно указывать типы параметров внутри функции.</p>
10
<p>В этом случае не обязательно явно указывать типы параметров внутри функции.</p>
11
<p>Перегрузка функций не ограничивается двумя версиями. Их может быть сколько угодно. Главное, что в конце всегда описывается функция, которая является общей по параметрам для всех вариантов. Внутри функции описывается вся логика для каждого варианта.</p>
11
<p>Перегрузка функций не ограничивается двумя версиями. Их может быть сколько угодно. Главное, что в конце всегда описывается функция, которая является общей по параметрам для всех вариантов. Внутри функции описывается вся логика для каждого варианта.</p>
12
<p>Опишем функцию add(), которая может принимать на вход два или три числа и возвращает их сумму:</p>
12
<p>Опишем функцию add(), которая может принимать на вход два или три числа и возвращает их сумму:</p>
13
<p>В статических языках перегрузка функций используется достаточно часто, но в большинстве из них она устроена не как в TypeScript. В этих языках создается несколько разных функций, которые с точки зрения программиста имеют одно имя. Поэтому там не нужна общая функция. Логика каждого варианта описывается внутри. Это избавляет код от необходимости реализовывать условную логику.</p>
13
<p>В статических языках перегрузка функций используется достаточно часто, но в большинстве из них она устроена не как в TypeScript. В этих языках создается несколько разных функций, которые с точки зрения программиста имеют одно имя. Поэтому там не нужна общая функция. Логика каждого варианта описывается внутри. Это избавляет код от необходимости реализовывать условную логику.</p>
14
<p>Зачем в TypeScript такая реализация и какие проблемы она решает? Это, как и многое другое в TypeScript - попытка учесть все варианты написания кода на JavaScript и покрыть их типами для написания типобезопасного кода.</p>
14
<p>Зачем в TypeScript такая реализация и какие проблемы она решает? Это, как и многое другое в TypeScript - попытка учесть все варианты написания кода на JavaScript и покрыть их типами для написания типобезопасного кода.</p>
15
<p>В JavaScript нередко создают функции, которые принимают на вход разные типы данных в разных вариациях. Перегрузка функций позволяет описать подобные функции в TypeScript, иначе пришлось бы использовать any и следить за типами самостоятельно.</p>
15
<p>В JavaScript нередко создают функции, которые принимают на вход разные типы данных в разных вариациях. Перегрузка функций позволяет описать подобные функции в TypeScript, иначе пришлось бы использовать any и следить за типами самостоятельно.</p>
16
<p>Технически после транспиляции в JavaScript остается одна функция - та, что содержит тело.</p>
16
<p>Технически после транспиляции в JavaScript остается одна функция - та, что содержит тело.</p>
17
<p>Перегрузка функций в TypeScript - это механизм, который стоит использовать, когда нет другого выбора. В большинстве случаев вместо перегрузки используются объединения или дженерики, о которых мы поговорим позже.</p>
17
<p>Перегрузка функций в TypeScript - это механизм, который стоит использовать, когда нет другого выбора. В большинстве случаев вместо перегрузки используются объединения или дженерики, о которых мы поговорим позже.</p>
18
<p>Перегрузка нужна, когда между параметрами есть зависимость, например, если оба параметра - строки, либо оба параметра - числа.</p>
18
<p>Перегрузка нужна, когда между параметрами есть зависимость, например, если оба параметра - строки, либо оба параметра - числа.</p>