@JavaSscriptNoob

Почему вылазит ошибка Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'EventStatusType'. в ts?

Мой тип
export type EventStatusType = {
  Open: boolean;
  Closed: boolean;
  Maintaince: boolean;
};

Обьект
EventTypes: {
Closed: false,
Maintenance: false,
Open: false
}

Код который вызывает ошибку
for (let key in eventTypes) {
    if (eventTypes[key]) { // ТУТ ОШИБКА eventTypes[key]) - булевое значение
      switch (key) {
        case 'Open':
          url = isFirst ? url.where('slss.EndDate', EMPTY, '') : url.or('slss.EndDate', EMPTY);
          isFirst = false;
          break;
        case 'Closed':
          url = isFirst
            ? url.where('slss.EndDate', GREATER_THAN, startDate.toISOString())
            : url.or('slss.EndDate', GREATER_THAN, startDate.toISOString());
          isFirst = false;
          break;
        case 'Maintenance':
          url = isFirst
            ? url.where('slss.EventType', EQUAL, 'Maintenance')
            : url.or('slss.EventType', EQUAL, 'Maintenance');
          break;
      }
    }
  }
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
let key: keyof EventStatusType;
for (key in eventTypes) {
Typescript не может автоматически вывести тип key потому что он структурный, и никак не может знать, что в объекте точно нет ещё каких-нибудь ключей, кроме тех что указаны в типе EventStatusType:
const foo = {
   Closed: false,
   Maintaince: false,
   Open: false,
   внезапно: 'Вася'
};

const bar: EventStatusType = foo; // ok
Поскольку с помощью кода в начале ты фактически говоришь Typescript: "я знаю лучше, там точно не будет ничего другого", то на всякий непредвиденный случай следует добавить в switch default который что-то сделает(например кинет ошибку) если таки лишний неведомый ключ прилетит.

P,S. А ещё у тебя в имени одного ключа опечатка: Maintaince и Maintenance.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы