Элемент typescript неявно имеет тип «любой», поскольку выражение типа X не может использоваться для индексирования типа Y

#typescript

Вопрос:

Любая помощь в этом была бы признательна

 interface Error {
  messages: string[];
    entity: 'test' | null;
}

interface GroupedErrors {
  [errorGroup: string]: Error['messages'] | Error[];
}

interface UngroupedErrors {
  ungrouped: Error[];
}

type GroupErrors = GroupedErrors | UngroupedErrors | {};

interface Preset {
  errors: Error[];
}

export function groupPresetErrors(preset: Preset): GroupErrors {
  return preset.errors.reduce<GroupErrors>((acc, error) => {
    if (error.entity === 'test') {
      return {
        ...acc,
        ['test']: acc['test']
          ? [...acc['test'], ...error.messages]
          : error.messages,
      };
    }

    return {
      ...acc,
      ['ungrouped']: acc['ungrouped'] ? [...acc['ungrouped'], error] : [error],
    };
  }, {});
}
 

Элемент неявно имеет тип»любой», потому что выражение типа»тест» нельзя использовать для индексирования типа «Групповые значения».
Свойство «тест» не существует для типа «Групповые».

Ссылка на игровую площадку

Комментарии:

1. Ошибка верна; тип вашего аккумулятора GroupErrors , как известно, не имеет test свойства, поэтому вы не можете безопасно получить к нему доступ. Возможно, вы хотите , чтобы вместо этого ваш аккумулятор был типовым GroupedErrors или чем-то еще более конкретным, например {[k: string]: string[]} , как в этом исправлении ? Поскольку ваш вопрос-это просто какой-то код и сообщение об ошибке, мне трудно быть уверенным, в чем именно заключается цель. Если мое предложенное выше исправление не сработает для вас, не могли бы вы уточнить? В противном случае я с удовольствием напишу ответ.

2. @jcalz Почему возникает ошибка iti, если GroupErrors может быть GroupedErrors , которая принимает любой строковый ключ (через [errorGroup: string] ?

3. GroupErrors является типом объединения, и вы можете безопасно получить доступ только к свойствам объединения, которые, как известно, присутствуют во всех членах объединения. Поскольку test неизвестно , присутствует ли в {} , вы не можете получить доступ к test свойству GroupErrors . Итак, как нам следует действовать здесь? Не могли бы вы отредактировать текст вопроса, чтобы описать, в чем заключается ваша проблема и какая помощь вам нужна? Или я могу предположить, что вышеупомянутое исправление сработает для вас, и просто дать ответ на этот вопрос?

4. @jcalz Я понимаю, что это тип союза it’а, но не должен ли десятник acc['test'] ? адресовать это?

5. @jcalz Мне нужно groupPresetErrors иметь возможность вернуться GroupErrors , потому что он может вернуться {}