Типизация объектов

Типизация объектов в TypeScript позволяет точно описать форму данных, с которыми работает приложение. Это особенно важно при работе с данными от сервера, состоянием компонентов и пропсами.


Литералы объектов как типы

Простейший способ описать объект — использовать литерал типа прямо в аннотации. Указываются имена свойств и их типы через двоеточие.

const user: { name: string; age: number } = {
  name: "Алексей",
  age: 25
};

Такой подход работает для разовых случаев, но имеет существенный недостаток — литерал нельзя переиспользовать. Если нужно описать несколько объектов с одинаковой структурой, приходится копировать одно и то же описание.


Проблема повторного использования

Представьте, что в приложении нужно работать с несколькими пользователями. Каждый раз писать { name: string; age: number } неудобно и приводит к дублированию кода. Для решения этой проблемы в TypeScript существуют два механизма — interface и type.


Interface — определение формы объекта

Ключевое слово interface создаёт именованный контракт, описывающий структуру объекта. Это наиболее распространённый способ типизации объектов в TypeScript.

interface User {
  name: string;
  email: string;
  age: number;
}

const user1: User = {
  name: "Мария",
  email: "maria@example.com",
  age: 30
};

const user2: User = {
  name: "Иван",
  email: "ivan@example.com",
  age: 28
};

Расширение интерфейсов

Интерфейсы можно расширять с помощью ключевого слова extends. Это позволяет создавать новые интерфейсы на основе существующих, добавляя дополнительные свойства.

interface User {
  name: string;
  email: string;
}

interface Admin extends User {
  role: string;
  permissions: string[];
}

const admin: Admin = {
  name: "Администратор",
  email: "admin@site.com",
  role: "superuser",
  permissions: ["read", "write", "delete"]
};

Type — алиас для любого типа

Ключевое слово type создаёт псевдоним для любого типа данных, не только для объектов. С его помощью можно описывать примитивы, объединения, кортежи и сложные структуры.

type User = {
  name: string;
  email: string;
  age: number;
};

const user: User = {
  name: "Елена",
  email: "elena@example.com",
  age: 22
};

Type может описывать не только объекты:

type ID = string;
type Status = "active" | "inactive";
type Point = [number, number];

Когда использовать interface, а когда type

Оба подхода позволяют описывать объекты, но есть рекомендации по выбору.

Используйте interface, когда:

  • Описываете форму объекта или класса
  • Планируете расширять тип через наследование
  • Работаете с пропсами компонентов в React

Используйте type, когда:

  • Нужно создать алиас для примитива или объединения типов
  • Описываете кортежи или другие сложные типы
  • Требуется выразить тип, который нельзя описать через интерфейс

В большинстве случаев для описания объектов данных предпочтительнее interface, так как он был создан специально для этой цели и поддерживает расширение.