AlexReal
@AlexReal
Супермен

Почему возникает ошибка типов?

Здравствуйте,
Подскажите, почему typescript выдает ошибку в такой ситуации:
type Test = {
  srn: number
}

const test: Test = { srn: 123 };

['srn', 'qre'].forEach((p) => {
  if (typeof test[p] === 'number') {
    test[p] = 34;
  }
})
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Test'.
  No index signature with a parameter of type 'string' was found on type 'Test'.
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 2
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
Вариант 1:
type Test = {
    srn: number;
    qre?: unknown;
};
const test: Test = { srn: 123 };

(['srn', 'qre'] as const).forEach((p) => {
  if (typeof test[p] === 'number') {
    test[p] = 34;
  }
});


Вариант 2:
type Test = {
  srn: number
}

const test: Test = { srn: 123 };

['srn', 'qre'].forEach((p) => {
  if (p === 'srn') {
    test[p] = 34;
  }
});


Вариант 3:
type Test = {
  srn: number
}

const test: Test = { srn: 123 };

const isKeyofTest = (s: string): s is keyof Test =>
    s === 'srn';

['srn', 'qre'].forEach((p) => {
  if (isKeyofTest(p)) {
    test[p] = 34;
  }
});

https://www.typescriptlang.org/play?#code/PTAEEYCg...
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
Для переменной p выводится тип string, то есть по мнению тайпскрипта, здесь возможно обращение к произвольному полю объекта test.
Как правильно затипизировать, зависит от того что тут должно быть. На данный момент для test можно указать тип Record
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы