---
sidebar_position: 5
---

# Generic types

**Generics (обобщения)** в TypeScript — это механизм, который позволяет создавать универсальные, переиспользуемые компоненты (функции, классы, интерфейсы), которые могут работать с разными типами данных, сохраняя при этом безопасность типов.

## Зачем нужны Generics?
- **Повторное использование кода:** Generics позволяют писать универсальные функции и классы, которые могут работать с любыми типами.
- **Безопасность типов:** Generics сохраняют информацию о типах, что помогает избежать ошибок на этапе компиляции.
- **Гибкость:** Generics позволяют создавать компоненты, которые могут адаптироваться к разным типам данных.

## Примеры использования Generics

### 1. Функции с Generics
```ts
function identity<T>(arg: T): T {
  return arg;
}

let output1 = identity<string>("Hello"); // Тип: string
let output2 = identity<number>(42); // Тип: number
```
**`T`** — это обобщенный тип (type parameter), который заменяется на конкретный тип при вызове функции.

### 2. Классы с Generics
```ts
class Box<T> {
  private value: T;

  constructor(value: T) {
    this.value = value;
  }

  getValue(): T {
    return this.value;
  }
}

let box1 = new Box<string>("Hello");
let box2 = new Box<number>(42);
```
Класс **`Box`** может работать с любым типом данных, переданным в **`T`**.

### 3. Интерфейсы с Generics
```ts
interface Pair<T, U> {
  first: T;
  second: U;
}

let pair: Pair<string, number> = { first: "Age", second: 30 };
```
Интерфейс **`Pair`** может работать с двумя разными типами (**`T`** и **`U`**).

### 4. Ограничения Generics (Constraints)
Иногда нужно ограничить типы, которые можно передать в Generics. Для этого используется ключевое слово **`extends`**.
```ts
interface Lengthwise {
  length: number;
}

function logLength<T extends Lengthwise>(arg: T): void {
  console.log(arg.length);
}

logLength("Hello"); // ОК, у строки есть свойство length
logLength([1, 2, 3]); // ОК, у массива есть свойство length
logLength(42); // Ошибка: у числа нет свойства length
```

### 5. Generics по умолчанию
Можно указать тип по умолчанию для Generics, если тип не был передан явно.
```ts
function createArray<T = string>(length: number, value: T): T[] {
  return Array(length).fill(value);
}

let strings = createArray(3, "x"); // string[]
let numbers = createArray<number>(3, 42); // number[]
```
## Преимущества Generics
- **Универсальность:** Generics позволяют писать код, который работает с разными типами.
- **Безопасность типов:** TypeScript проверяет типы на этапе компиляции, что помогает избежать ошибок.
- **Читаемость:** Generics делают код более выразительным и понятным.

🚀 **_Источник: DeepSeek_**