Индексная сигнатура описывает тип свойств, когда вы заранее не знаете их имена — моделирует словари/карты, где ключи динамические.
{
[: ]: ;
}
: = { : , : };
scores. = ;
scores.;
scores.;
Индексная сигнатура описывает тип свойств, когда вы заранее не знаете их имена — моделирует словари/карты, где ключи динамические.
{
[: ]: ;
}
: = { : , : };
scores. = ;
scores.;
scores.;
С простой индексной сигнатурой компилятор предполагает, что каждый ключ существует, поэтому scores.typo типизирован как number, даже если на самом деле это undefined во время выполнения. Включение noUncheckedIndexedAccess это исправляет:
// with noUncheckedIndexedAccess: true
scores.math; // number | undefined → forces you to handle the missing case
interface Config {
name: string; // known property
[key: string]: string | number; // plus arbitrary extra keys
}
Все именованные свойства должны быть присваиваемы типу значения индексной сигнатуры.
type Scores = Record<string, number>; // same as the index signature
type Roles = Record<"admin" | "user", boolean>; // constrained keys
Record — это идиоматическое сокращение и поддерживает ограниченное объединение ключей, чего не может простой [key: string].
Индексные сигнатуры моделируют объекты с подлинно динамическими ключами (таблицы поиска, кэши, разобранные карты JSON).
Знайте предостережение о безопасности (noUncheckedIndexedAccess) и отдавайте предпочтение Record<K, V> для читаемости — и отдавайте предпочтение Map, когда ключи действительно открыты и вам нужна реальная семантика итерации/размера.