Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про TypeScript: TypeScript, generics, custom types, type parameters, generic constraints

Как использовать generics для создания кастомных типов?

Этот вопрос проверяет понимание обобщённых типов (generics) в TypeScript и их применение для создания гибких и переиспользуемых пользовательских типов.

Короткий ответ

Generics позволяют создавать компоненты, которые работают с различными типами, а не с одним конкретным. Вы объявляете параметр типа (например, ) в определении типа, интерфейса или функции. При использовании этого типа вы можете указать конкретный тип, который заменит параметр. Это делает код типобезопасным и переиспользуемым, избегая дублирования логики для разных типов данных.

Длинный ответ

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 в функциях и интерфейсах

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"
};

Ограничения generics (Generic Constraints)

Иногда нужно гарантировать, что параметр типа имеет определённые свойства. Для этого используется ключевое слово 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 широко используются в:

  • Библиотеках и фреймворках: React (например, для типизации пропсов и состояния), Redux Toolkit.
  • Структурах данных: создание типизированных очередей, стеков, связных списков.
  • Работе с API: типизация ответов сервера, где структура данных известна, но может меняться для разных эндпоинтов.

Вывод: Используйте generics для создания гибких, переиспользуемых и типобезопасных кастомных типов, особенно когда логика компонента одинакова для разных типов данных, но вы хотите сохранить информацию о конкретном типе во время компиляции.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • TypeScript

    TypeScript

Ключевые слова

#TypeScript

#generics

#custom types

#type parameters

#generic constraints

Подпишись на React Developer в телеграм