HTML Diff
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>