> Как типизировать объект с разными ключами и значениями в TypeScript? (TypeScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Инрэко, КИТМЕД

Стек: TypeScript

> Пример ответа

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

  1. Индексная сигнатура (Index Signature) - когда ключи имеют один тип, а значения - другой, но все значения однотипны:
TYPESCRIPT
interface StringDictionary {
[key: string]: string;
}
const obj: StringDictionary = { name: "Alice", city: "Moscow" };
  1. Запись (Record) - удобный встроенный утилитарный тип для однотипных значений:
TYPESCRIPT
type NumberRecord = Record<string, number>;
const scores: NumberRecord = { math: 95, physics: 88 };
  1. Маппинг (Mapped Types) - когда ключи ограничены конкретным набором, а значения могут различаться по типам:
TYPESCRIPT
type StatusMap = {
[K in "active" | "inactive"]: K extends "active" ? boolean : string;
};
// или более гибко:
type Config = {
[key: string]: string | number | boolean;
};
  1. Дискриминирующие объединения (Discriminated Unions) - для объектов с разными структурами в зависимости от ключа:
TYPESCRIPT
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; sideLength: number };
  1. Условные типы с in - для точного контроля:
TYPESCRIPT
type MixedObject<T extends string> = {
[K in T]: K extends "id" ? number : string;
};
type MyObj = MixedObject<"id" | "name">; // { id: number; name: string }

Выбор зависит от задачи: для динамических ключей используйте индексную сигнатуру, для фиксированных - маппинг или Record, для сложной логики - условные типы.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью