Skip to content

Commit

Permalink
fix function overload description
Browse files Browse the repository at this point in the history
  • Loading branch information
bondiano authored and v1valasvegan committed Jan 8, 2023
1 parent 057a48d commit 4ecfcda
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions modules/20-functions/85-function-overloads/description.ru.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
---

name: Перегрузка функций (Function Overloads)
theory: |
Expand All @@ -9,10 +8,12 @@ theory: |
function concat(a: number, b: number): string;
function concat(a: string, b: string): string;
function concat(a: any, b: any): string {
return typeof a === 'string'
? `${a}${b}`
: `${a.toFixed()}${b.toFixed()}`
function concat(a: unknown, b: unknown): string {
if (typeof a === 'number') {
return `${a.toFixed()}${b.toFixed()}`;
}
return `${a}${b}`;
}
concat('one', 'two'); // onetwo
Expand All @@ -22,10 +23,10 @@ theory: |
Здесь определяется одна функция `concat()`, у которой две версии, одна принимает на вход два числа, другая две строки. Обе версии выполняют конкатенацию, но делают это по-разному. Строки конкатенируются сразу, а вот у чисел сначала отбрасывается дробная часть.
Реализация поведения для обеих версий делается в третьей функции с тем же именем, но с таким описанием параметров, которое подойдет под каждую версию функции. В примере выше типы параметров определены как `any`, что дает возможность вызывать функцию как со строками, так и с числами.
Реализация поведения для обеих версий делается в третьей функции с тем же именем, но с таким описанием параметров, которое подойдет под каждую версию функции. В примере выше типы параметров определены как `unknown`, что дает возможность вызывать функцию как со строками, так и с числами.
Вся логика, для всех версий функций описывается в этом последнем определении. То по какой ветке идти, делается с помощью проверки типов. В примере выше достаточно проверить тип только первого параметра, так как второй в таком случае точно будет строкой. Это обеспечивает система типов и компилятор.
Для перезагрузки не обязательно использовать объявление функций, все то же самое можно сделать при помощи стрелочной функции:
```
Expand Down Expand Up @@ -55,7 +56,7 @@ theory: |
function add(a: string, b: string): string;
// Сигнатура подходит под все примеры выше
function add(a: any, b: any, c?: number): unknown {
function add(a: unknown, b: unknown, c?: number): unknown {
// тут вся логика
if (c === undefined) {
// ...
Expand Down

0 comments on commit 4ecfcda

Please sign in to comment.