элемент неявно имеет тип ‘any’, потому что выражение типа ‘string’ нельзя использовать для индексации в angularjs

#typescript #angular11

#typescript #angular11

Вопрос:

*** Элементы неявно имеют тип ‘any’, потому что выражение типа ‘string’ нельзя использовать для индексирования ‘{}’ В типе ‘{}’ не найдена индексная подпись с параметром типа ‘string’

А также отображение объекта, возможно, не определено.


Я попытался реализовать этот код в файле typescript, но он показывает эти ошибки. Почему? Я не могу найти ошибку. пожалуйста, помогите.

 getGlobalData() {
    return this.http.get(this.globalDataUrl, { responseType: 'text' }).pipe(
      map(result => {
        let data: GlobalDataSummary[] = [];
        let raw = {}
        let rows = result.split('n');
        rows.splice(0, 1);
        // console.log(rows);
        rows.forEach(row => {
          let cols = row.split(/,(?=S)/)

          let cs = {
            country: cols[3],
            confirmed:  cols[7],
            deaths:  cols[8],
            recovered:  cols[9],
            active:  cols[10],
          };
          let temp: GlobalDataSummary = raw[cs.country];
          if (temp) {
            temp.active = cs.active   temp.active
            temp.confirmed = cs.confirmed   temp.confirmed
            temp.deaths = cs.deaths   temp.deaths
            temp.recovered = cs.recovered   temp.recovered

            raw[cs.country] = temp;
          } else {
            raw[cs.country] = cs;
          }
        })
        return <GlobalDataSummary[]>Object.values(raw);
      })
    )
  }
 

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

1. Если вы просто хотите, чтобы ошибка исчезла, let raw:any = {} . Но это отнимает смысл Typescript. Вы могли бы даже создать индексный тип { [string]:any} . Но даже тогда вы теряете преимущества типизации, но я часто делаю это как временное решение при рефакторинге существующего кода, чтобы позже создать лучший тип.

Ответ №1:

выражение типа ‘string’ не может использоваться для индексирования ‘{}’

Это означает, что вы не можете сделать {}['somePropertyName'] . И это потому, что ваша raw переменная не имеет явного типа, и ваш код инициализировал ее как {} пустой объект, у которого нет индексатора свойств.

Вы можете указать raw тип, который позволяет вашему коду получать его свойство через строковый индекс следующим образом:

 let raw: {
    [key: string]: any
};
 

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

1. ОК. Спасибо. Ошибка устранена… Но…. Теперь в temp : GlobalDataSummary отображается, что «объект, возможно, не определен», а в return <GlobalDataSummary [] >объект . значения (raw), что «переменная raw используется перед назначением»…. Что мне делать?