Skip to main content

Що таке index signature в інтерфейсі?

1. Що таке index signature

Index signature - це спеціальний синтаксис в інтерфейсі (або типі), який каже TypeScript: "у цього об'єкта може бути будь-яка кількість властивостей із визначеним типом ключів і значень".


Приклад

javascript
interface Dictionary { [key: string]: string; } const colors: Dictionary = { red: "#ff0000", green: "#00ff00", blue: "#0000ff", };

Тут [key: string]: string - це index signature.

Вона означає:

  • ключі можуть бути будь-якими рядками (string);
  • значення для всіх цих ключів мають бути рядками (string).

2. Загальний синтаксис

javascript
interface SomeInterface { [key: KeyType]: ValueType; }
ЕлементЩо означає
keyім'я змінної (може бути будь-яким)
KeyTypeтип ключа (string, number, symbol)
ValueTypeтип значень

Приклад із числами

javascript
interface NumericIndex { [index: number]: string; } const arr: NumericIndex = ["one", "two", "three"];

У цьому випадку TypeScript перевірить, що всі значення за числовими індексами - рядки. Тобто arr[0], arr[1] тощо - це string.


3. Комбінування зі звичайними властивостями

Можна поєднувати конкретні поля з динамічними ключами:

javascript
interface ProductInfo { id: number; name: string; [extra: string]: string | number; // індексна сигнатура } const p: ProductInfo = { id: 10, name: "Shirt", color: "white", price: 49, };

Все коректно, тому що й конкретні властивості (id, name), й динамічні (color, price) відповідають типу string | number.


4. Важливо: індексна сигнатура задає обмеження для всіх властивостей

Якщо в інтерфейсі є [key: string]: string, то всі властивості цього інтерфейсу мають бути сумісні з string.

javascript
interface BadExample { id: number; // Помилка [key: string]: string; // тому що number несумісний зі string }

Щоб виправити, потрібно включити обидва типи:

javascript
interface GoodExample { id: number; [key: string]: string | number; }

5. Типи ключів: string, number, symbol

Тип ключаКоли використовуєтьсяПриклад
stringдля звичайних об'єктів[key: string]: number
numberдля масивоподібних структур[index: number]: string
symbolрідко, для унікальних ключів[key: symbol]: boolean

Зазвичай застосовують [key: string], тому що більшість об'єктів у JS використовують рядкові ключі.


6. Різниця між index signature та Record

Особливістьindex signatureRecord<K, T>
Синтаксис[key: string]: TRecord<string, T>
Гнучкість (можна додати поля)ТакОбмежено
Підходить для інтерфейсівТакЧастіше в type
Можна комбінувати з конкретними властивостямиТакНе завжди зручно
Перевірка ключів через unionНіТак

7. Приклад реального застосування

Словник перекладів

javascript
interface Translations { [locale: string]: string; } const messages: Translations = { en: "Hello", fr: "Bonjour", de: "Hallo", };

Карта користувачів

javascript
interface UsersMap { [id: number]: { name: string; age: number }; } const users: UsersMap = { 1: { name: "Tim", age: 25 }, 2: { name: "Max", age: 30 }, };

Підсумок

Index signature - це спосіб описати об'єкт із непередбачуваними (динамічними) ключами в TypeScript.

Синтаксис:

javascript
interface Example { [key: string]: ValueType; }

Дозволяє:

  • описувати словники й таблиці (Record-подібні об'єкти),
  • комбінувати фіксовані та довільні поля,
  • контролювати тип значень за будь-яких ключів.

Часто використовується для:

  • словників (Dictionary),
  • конфігурацій (Config),
  • кешів (Cache),
  • локалізацій (Translations).

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.