0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Представим, что дженерики пропали из языка. Тогда мы столкнемся с дублированием кода. Придется описывать один и тот же алгоритм для разных типов данных много раз.</p>
1
<p>Представим, что дженерики пропали из языка. Тогда мы столкнемся с дублированием кода. Придется описывать один и тот же алгоритм для разных типов данных много раз.</p>
2
<p>Возьмем для примера функцию last(), возвращающую последний элемент массива. Ниже ее обобщенная версия:</p>
2
<p>Возьмем для примера функцию last(), возвращающую последний элемент массива. Ниже ее обобщенная версия:</p>
3
<p>Теперь попробуем реализовать такое же поведение на обычных функциях. Для этого нам придется создать по одной функции для каждого типа. Причем имя функции должно быть уникальным:</p>
3
<p>Теперь попробуем реализовать такое же поведение на обычных функциях. Для этого нам придется создать по одной функции для каждого типа. Причем имя функции должно быть уникальным:</p>
4
<p>А что если у нас несколько типов? Тогда нужно подсчитать, сколько функций нужно определить - умножить количество всех возможных типов на количество параметров типа.</p>
4
<p>А что если у нас несколько типов? Тогда нужно подсчитать, сколько функций нужно определить - умножить количество всех возможных типов на количество параметров типа.</p>
5
<p>Реализация с помощью перегруженной функции упрощает задачу. При работе с ними нам не придется создавать новые имена:</p>
5
<p>Реализация с помощью перегруженной функции упрощает задачу. При работе с ними нам не придется создавать новые имена:</p>
6
<p>В случае TypeScript даже логика не будет дублироваться, но это особенность именно TypeScript. В других статически типизированных языках придется дублировать и логику тоже.</p>
6
<p>В случае TypeScript даже логика не будет дублироваться, но это особенность именно TypeScript. В других статически типизированных языках придется дублировать и логику тоже.</p>
7
<p>Какой бы вариант реализации мы ни выбрали, соблюдаются две вещи:</p>
7
<p>Какой бы вариант реализации мы ни выбрали, соблюдаются две вещи:</p>
8
<ul><li>Передаваемые внутрь значения никак не используются, они только перекладываются из одного места в другое</li>
8
<ul><li>Передаваемые внутрь значения никак не используются, они только перекладываются из одного места в другое</li>
9
<li>Логика работы всегда остается одной и той же, условные конструкции по типу данных отсутствуют</li>
9
<li>Логика работы всегда остается одной и той же, условные конструкции по типу данных отсутствуют</li>
10
</ul><p>В Computer Science есть один важный термин - <strong>параметрический полиморфизм</strong>. Это свойство функции, позволяющее обрабатывать значения разных типов одним способом, используя один алгоритм. Это значит, что дженерики - это реализация параметрического полиморфизма в TypeScript.</p>
10
</ul><p>В Computer Science есть один важный термин - <strong>параметрический полиморфизм</strong>. Это свойство функции, позволяющее обрабатывать значения разных типов одним способом, используя один алгоритм. Это значит, что дженерики - это реализация параметрического полиморфизма в TypeScript.</p>
11
<p>Параметрический полиморфизм играет важную роль в статически типизированных языках, потому что там приходится явно указывать типы у функций. Он есть почти во всех высокоуровневых статически типизированных языках. В Java и C# это тоже называется дженериками. В C++ используется термин "шаблоны", но смысл от этого не меняется, хотя шаблоны в С++ - это больше, чем параметрический полиморфизм.</p>
11
<p>Параметрический полиморфизм играет важную роль в статически типизированных языках, потому что там приходится явно указывать типы у функций. Он есть почти во всех высокоуровневых статически типизированных языках. В Java и C# это тоже называется дженериками. В C++ используется термин "шаблоны", но смысл от этого не меняется, хотя шаблоны в С++ - это больше, чем параметрический полиморфизм.</p>
12
<p>В противовес статически типизированным языкам есть JavaScript, Python, Ruby, PHP и другие языки с динамической типизацией. В них дженерики не нужны. В подобных языках любой обобщенный алгоритм автоматически работает для всех типов данных.</p>
12
<p>В противовес статически типизированным языкам есть JavaScript, Python, Ruby, PHP и другие языки с динамической типизацией. В них дженерики не нужны. В подобных языках любой обобщенный алгоритм автоматически работает для всех типов данных.</p>