Этот вопрос проверяет понимание обобщённых типов (generics) в TypeScript и их применение для создания гибких и переиспользуемых пользовательских типов.
Generics (обобщённые типы) — это мощный инструмент TypeScript для создания компонентов, которые могут работать с различными типами данных, сохраняя при этом информацию о типе. Вместо того чтобы жёстко задавать тип (например, number или string), вы используете параметр типа, который будет заменён конкретным типом при использовании компонента.
Параметр типа обычно обозначается одной буквой, например T (от Type). Его можно использовать при определении типа, интерфейса или класса.
// Обобщённый тип (Generic Type)
type Container<T> = {
value: T;
id: number;
};
// Использование с конкретными типами
const stringContainer: Container<string> = { value: "Hello", id: 1 };
const numberContainer: Container<number> = { value: 42, id: 2 };
Generics особенно полезны для функций, которые должны возвращать значение того же типа, что и аргумент, или для описания структур данных, таких как массивы или промисы.
// Обобщённая функция
function identity<T>(arg: T): T {
return arg;
}
const output = identity<string>("myString"); // Тип output - string
// Обобщённый интерфейс для ответа API
interface ApiResponse<T> {
data: T;
status: number;
message: string;
}
const userResponse: ApiResponse<{ name: string; age: number }> = {
data: { name: "Alice", age: 30 },
status: 200,
message: "OK"
};
Иногда нужно гарантировать, что параметр типа имеет определённые свойства. Для этого используется ключевое слово extends.
interface HasLength {
length: number;
}
function logLength<T extends HasLength>(arg: T): void {
console.log(arg.length); // Безопасно, т.к. T гарантированно имеет length
}
logLength("text"); // OK, строка имеет свойство length
logLength([1, 2, 3]); // OK, массив имеет length
// logLength(42); // Ошибка: число не имеет свойства length
Generics широко используются в:
Вывод: Используйте generics для создания гибких, переиспользуемых и типобезопасных кастомных типов, особенно когда логика компонента одинакова для разных типов данных, но вы хотите сохранить информацию о конкретном типе во время компиляции.