Сигнатуры индекса в TypeScript

30 октября 2026
Автор

Дмитрий Нечаев

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

Курс по теме

Освоить TypeScript с нуля на курсе

40 000+ студентов · рейтинг 4.8 · гарантия возврата 30 дней

Основы

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

interface StringArray {
  [index: number]: string;
}

const myArray: StringArray = getStringArray();
const secondItem = myArray[1];  // secondItem имеет тип string

В данном примере, интерфейс StringArray объявляет, что при обращении по числовому индексу, мы всегда получим строку.

Сигнатуры индекса позволяют определять типы для свойств объектов, ключи которых неизвестны во время компиляции. Чтобы уверенно использовать сигнатуры индекса и создавать надежный код, необходимо глубокое понимание TypeScript. Приходите на наш большой курс TypeScript с нуля. На курсе 192 уроков и 17 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Применение разных типов для индексов

TypeScript поддерживает использование строк или чисел в качестве ключей для сигнатуры индекса. Также возможно использование символов, шаблонных строк или объединений этих типов. Важно понимать, что значения, возвращаемые числовым индексатором, должны быть подтипом значений, возвращаемых строковым индексатором, так как JavaScript преобразует числовые ключи в строки:

interface Animal {
  name: string;
}

interface Dog extends Animal {
  breed: string;
}

// Ошибка: индексация числом может вернуть другой тип Animal
interface NotOkay {
  [x: number]: Animal;
  [x: string]: Dog;
}

Ограничения и возможности

Индексируемые типы мощный инструмент для работы со словарными структурами данных. Однако они также накладывают ограничения на соответствие типов свойств и значений:

interface NumberDictionary {
  [index: string]: number;
  length: number;  // допустимо
  name: string;    // ошибка: тип 'string' не присваиваем типу индекса 'number'
}

Однако, если индексируемый тип представляет собой объединение типов, это позволяет содержать свойства разных типов:

interface NumberOrStringDictionary {
  [index: string]: number | string;
  length: number;  // допустимо
  name: string;    // допустимо
}

Использование readonly

Для предотвращения изменения значений по индексам, можно использовать модификатор readonly:

interface ReadonlyStringArray {
  readonly [index: number]: string;
}

let myArray: ReadonlyStringArray = getReadOnlyStringArray();
// Ошибка: изменение значения по индексу запрещено
myArray[2] = "Mallory";

Заключение

Сигнатуры индекса в TypeScript предоставляют гибкость при работе с динамическими структурами данных, позволяя разработчикам определять интерфейсы для объектов и массивов с заранее неизвестными свойствами. Однако важно понимать ограничения, связанные с типами данных и их совместимостью, чтобы эффективно использовать эту возможность языка.

Сигнатуры индекса позволяют создавать более гибкие типы для объектов с динамическими свойствами. На нашем курсе TypeScript с нуля вы получите необходимые знания и практические навыки. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в TypeScript прямо сегодня.

Стрелочка влевоInterface в TypeScriptРасширение типов в TypeScriptСтрелочка вправо

Постройте личный план изучения Typescript до уровня Middle — бесплатно!

Typescript — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Typescript

TypeScript с Zod: генерация и валидация типовКак правильно использовать тип UnknownИспользование Union в TypeScriptTypeScript с GraphQL — типизация и кодогенерацияТипы данных в TypeScriptType Guards в TypeScript — как работает сужение типовСтруктурная типизация в TypeScriptNull и Undefined в TypeScriptSymbols в TypeScriptТип never в TypeScriptСужение типов (Narrowing) в TypeScriptОператор infer в Typescript?Понимание Literal Types. Ключевые аспекты и примеры использованияТипы функций в TypeScript. Руководство для разработчиковEnums vs Union Types в TypeScript: сравнение и выборEnums в TypeScriptДискриминированные объединения в TypeScriptСлужебный тип Awaited в TypeScriptКак типизировать массивы TypeScriptКак правильно использовать тип anyTypeScript с Express.js: типизация маршрутов и middleware
Вариативные кортежи (Variadic Tuple Types) в TypeScriptUtility Types в TypeScript — полный разбор встроенных утилитТипизация ответов API с fetch и generic-функцииtypeof в TypeScriptTemplate Literal Types в TypeScriptОператор satisfies в TypeScriptПаттерн Result для обработки ошибок без исключенийУтилитный тип NoInfer в TypeScriptMapped Types в TypeScriptОператор типа keyof в TypeScriptРуководство по тестированию TypeScript с JestТипы доступа по индексу в TypeScriptconst assertions в TypeScriptУсловные типы в TypeScriptGenerics в TypeScriptBranded Types в TypeScript — номинальная типизацияПродвинутые Conditional Types в TypeScript
Переменные и константы в TypeScriptTypeScript: ключевое слово using и Explicit Resource ManagementНастройка типов с declare module в TypeScriptTypeScript типизация в Node.js проектеTypeScript ESLint — настройка линтера для проектаTypeScript 5: новые возможности и измененияПреобразование к типу в TypeScript (Type Assertion)Кортежи в TypeScripttsconfig.json — полный разбор настроек TypeScript компилятораTypeScript с tRPC — типобезопасный APITypeScript strict и strictNullChecks — строгий режимБезопасные env переменные в TypeScriptКак собрать TypeScript проект с RollupОбъекты в TypeScriptMonorepo с Turborepo и TypeScriptIsolated Declarations в TypeScriptTypeScript с Hono: типобезопасный веб-фреймворкФункции в TypeScriptТип функции и стрелочные функции в TypeScriptТипизация ошибок и обработка исключений в TypeScriptTypeScript ключевое слово declareМассивы в TypeScript
Открыть базу знаний

Лучшие курсы по теме

изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

CSS Flexbox

Антон Ларичев
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
бесплатно
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий