Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про TypeScript: union, type

Как типизировать объект с разным набором полей у сущностей?

Вопрос проверяет умение моделировать разные варианты сущностей и корректно описывать их в системе типов.

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

Для объектов с разным набором полей обычно используют union-типы. Каждый вариант описывается своим типом или интерфейсом. TypeScript умеет сужать типы по проверкам. Это позволяет безопасно работать с разными структурами данных. Такой подход делает код понятным и защищённым от ошибок.

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

На практике часто встречаются сущности, которые имеют общие поля, но различаются деталями.

Базовый подход

Самый распространённый способ — union-типы:

type User = Admin | Guest;

interface Admin {
  role: "admin";
  permissions: string[];
}

interface Guest {
  role: "guest";
  expiresAt: Date;
}

Здесь:

  • User может быть разного вида

  • набор полей зависит от роли

Сужение типов

TypeScript умеет автоматически определять конкретный вариант:

function processUser(user: User) {
  if (user.role === "admin") {
    user.permissions; // доступно
  }
}

Это называется type narrowing.

Общие поля

Часто выносят общие свойства:

interface BaseUser {
  id: number;
}

interface Admin extends BaseUser {
  role: "admin";
}

interface Guest extends BaseUser {
  role: "guest";
}

Альтернативы

В зависимости от задачи можно использовать:

  • optional-поля (хуже для строгой типизации)

  • дженерики

  • mapped-типы

Вывод

Union-типы позволяют точно описывать объекты с разным набором полей. Это основной инструмент моделирования сложных доменных сущностей в TypeScript.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • TypeScript

    TypeScript

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

#union

#type

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