← Назад к вопросам

В каких случаях использовать Record Type

1.8 Middle🔥 91 комментариев
#TypeScript

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Record Type в TypeScript

Record — это утилита-тип в TypeScript, которая создаёт объект с известным набором ключей и значениями одного типа. Это мощный инструмент для типизации объектов с предсказуемой структурой.

Синтаксис

type Record<K extends string | number | symbol, T> = {
  [P in K]: T;
};

Где:

  • K — тип ключей (строки, числа, литеральные типы)
  • T — тип значений

Основные сценарии использования

1. Словарь с фиксированными ключами

Когда нужен объект со строго определённым набором свойств:

type UserRole = "admin" | "user" | "guest";

const rolePermissions: Record<UserRole, string[]> = {
  admin: ["read", "write", "delete"],
  user: ["read", "write"],
  guest: ["read"]
};

TypeScript гарантирует, что все ключи определены и нет лишних.

2. Маппирование типов

Отображение значений одного типа в другой:

type Status = "pending" | "success" | "error";

const statusMessages: Record<Status, string> = {
  pending: "Обработка...",
  success: "Успешно!",
  error: "Ошибка!"
};

3. Кэширование и ассоциативные массивы

Для хранения данных по уникальному ключу:

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

// Словарь пользователей по ID
const usersById: Record<string, User> = {};

usersById["123"] = { id: "123", name: "Иван" };

4. Конфигурация приложения

Когда разные окружения требуют разных настроек:

type Environment = "development" | "staging" | "production";

interface Config {
  apiUrl: string;
  debug: boolean;
}

const configs: Record<Environment, Config> = {
  development: { apiUrl: "http://localhost:3000", debug: true },
  staging: { apiUrl: "https://staging.api.com", debug: false },
  production: { apiUrl: "https://api.com", debug: false }
};

5. Состояния UI компонента

Для управления различными состояниями:

type ComponentState = "loading" | "idle" | "error";

const stateStyles: Record<ComponentState, string> = {
  loading: "opacity-50 pointer-events-none",
  idle: "cursor-pointer",
  error: "bg-red-100 border-red-500"
};

Сравнение с альтернативами

Record vs Object

// Object — мало информации о типе
const config: object = { a: 1, b: 2 };

// Record — явная типизация ключей и значений
const config: Record<"a" | "b", number> = { a: 1, b: 2 };

Record vs Interface

// Interface — для структур с названными свойствами
interface User {
  name: string;
  age: number;
}

// Record — для динамических наборов ключей
type UserCache = Record<string, User>;

Практический пример: Форма с ошибками валидации

interface FormData {
  email: string;
  password: string;
  name: string;
}

type FormErrors = Record<keyof FormData, string | null>;

const errors: FormErrors = {
  email: null,
  password: "Пароль слишком короткий",
  name: null
};

// Безопасный доступ к ошибкам
const emailError = errors["email"]; // string | null

Выводы

Используй Record когда:

  • Нужно создать объект с известным набором ключей
  • Все значения имеют одинаковый тип
  • Требуется полнота типизации (TypeScript проверит все ключи)
  • Нужна гибкость динамических ключей с типобезопасностью

Не используй Record когда:

  • Свойства имеют разные типы (используй interface)
  • Структура неопределена (используй Record<string, unknown>)
  • Нужна специальная документация свойств
В каких случаях использовать Record Type | PrepBro