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