Skip to main content

Generic types

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

Зачем нужны Generics?

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

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

1. Функции с Generics

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

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

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.

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, если тип не был передан явно.

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