TypeScript: продвинутые типы — Generics, Utility Types

Мы просто и по делу рассказываем про ИИ-инструменты для работы: сравнения, пошаговые гайды, бесплатные альтернативы и реальные сценарии применения. Помогаем выбрать между ChatGPT, Gemini, Claude, локальными моделями и десятками узкоспециализированных сервисов — от дизайна и HR до аналитики и SEO. Меньше хайпа, больше практики и экономии времени каждый день.

typescriptgenericsutility types

TypeScript ценят не только за автодополнение, но и за возможность описывать сложную логику на уровне типов. Если базовые string | number уже не впечатляют, пора разбираться с Generics и Utility Types — это то, что делает код гибким, безопасным и удобным в поддержке.

Generics — типы с параметрами

Generics позволяют писать переиспользуемый код без потери типизации.

function identity(value: T): T {
  return value;
}

Здесь T — универсальный тип. Функция принимает значение любого типа и возвращает его же без потери информации.

Пример с интерфейсом:

interface ApiResponse {
  data: T;
  status: number;
}

Теперь можно точно описывать ответ API:

const userResponse: ApiResponse<{ name: string }> = {
  data: { name: "Alice" },
  status: 200
};

Ограничения generics

Иногда универсальность нужно ограничить:

function getLength(item: T): number {
  return item.length;
}

Так TypeScript гарантирует, что у item есть свойство length.

Utility Types — встроенные помощники

Это готовые типы для трансформации существующих структур. Самые полезные:

  • Partial — делает все поля необязательными
type User = { name: string; age: number };
type PartialUser = Partial;

Удобно для update-операций.

  • Required — делает все поля обязательными
type FullUser = Required;
  • Readonly — запрещает изменять свойства
const user: Readonly = { name: "Bob", age: 30 };
  • Pick — выбирает нужные поля
type UserPreview = Pick;
  • Omit — исключает поля
type UserWithoutAge = Omit;
  • Record — создает объект с ключами одного типа и значениями другого
type Roles = Record;

Зачем это нужно на практике 💡

Generics и Utility Types помогают:

  • уменьшать дублирование типов
  • безопасно описывать ответы API
  • делать универсальные компоненты и функции
  • упрощать рефакторинг
  • ловить ошибки еще до запуска кода

Например, в React generic-компоненты часто используют для таблиц, форм и хуков. А Partial, Pick, Omit особенно полезны в DTO, слоях API и работе с состоянием.

Частая ошибка новичков 🚫

Использовать any там, где нужен generic.
any отключает проверку типов, а T сохраняет гибкость и контроль. Если хотите масштабируемый TypeScript-код, лучше выбирать generics, а не уходить в "типовую анархию".

Вывод ✅

Если коротко:

  • Generics — для универсальности
  • Utility Types — для быстрой трансформации типов
  • вместе они делают TypeScript по-настоящему мощным инструментом

Хорошее владение этими возможностями напрямую влияет на качество архитектуры, DX и скорость разработки 🚀

Подписывайтесь на подборку каналов про IT — там еще больше полезного контента для разработчиков, тимлидов и всех, кто следит за индустрией.

  • 🗣 Подборки каналов
  • 🧠 Каталог ботов и приложений
  • 🗺 Навигация

Читайте так же