Комментарии (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>)
- Нужна специальная документация свойств