--- sidebar_position: 5 --- # Generic types **Generics (обобщения)** в TypeScript — это механизм, который позволяет создавать универсальные, переиспользуемые компоненты (функции, классы, интерфейсы), которые могут работать с разными типами данных, сохраняя при этом безопасность типов. ## Зачем нужны Generics? - **Повторное использование кода:** Generics позволяют писать универсальные функции и классы, которые могут работать с любыми типами. - **Безопасность типов:** Generics сохраняют информацию о типах, что помогает избежать ошибок на этапе компиляции. - **Гибкость:** Generics позволяют создавать компоненты, которые могут адаптироваться к разным типам данных. ## Примеры использования Generics ### 1. Функции с Generics ```ts function identity(arg: T): T { return arg; } let output1 = identity("Hello"); // Тип: string let output2 = identity(42); // Тип: number ``` **`T`** — это обобщенный тип (type parameter), который заменяется на конкретный тип при вызове функции. ### 2. Классы с Generics ```ts class Box { private value: T; constructor(value: T) { this.value = value; } getValue(): T { return this.value; } } let box1 = new Box("Hello"); let box2 = new Box(42); ``` Класс **`Box`** может работать с любым типом данных, переданным в **`T`**. ### 3. Интерфейсы с Generics ```ts interface Pair { first: T; second: U; } let pair: Pair = { first: "Age", second: 30 }; ``` Интерфейс **`Pair`** может работать с двумя разными типами (**`T`** и **`U`**). ### 4. Ограничения Generics (Constraints) Иногда нужно ограничить типы, которые можно передать в Generics. Для этого используется ключевое слово **`extends`**. ```ts interface Lengthwise { length: number; } function logLength(arg: T): void { console.log(arg.length); } logLength("Hello"); // ОК, у строки есть свойство length logLength([1, 2, 3]); // ОК, у массива есть свойство length logLength(42); // Ошибка: у числа нет свойства length ``` ### 5. Generics по умолчанию Можно указать тип по умолчанию для Generics, если тип не был передан явно. ```ts function createArray(length: number, value: T): T[] { return Array(length).fill(value); } let strings = createArray(3, "x"); // string[] let numbers = createArray(3, 42); // number[] ``` ## Преимущества Generics - **Универсальность:** Generics позволяют писать код, который работает с разными типами. - **Безопасность типов:** TypeScript проверяет типы на этапе компиляции, что помогает избежать ошибок. - **Читаемость:** Generics делают код более выразительным и понятным. 🚀 **_Источник: DeepSeek_**