Невозможно установить свойство "год" неопределенного массива TypeScript - PullRequest
0 голосов
/ 26 ноября 2018

В моем компоненте есть следующее объявление:

private years: Array<{
    year: string,
    colspan: number
  }> = [];

Это должен быть массив years, где каждая запись имеет два свойства year и colspan.Теперь я хочу изменить эту переменную следующим методом, вызываемым в моем ngOnInit:

fillYearsArray = () => {
    var currentIndex : number = 1;
    //fill the first entry and do not change it afterwards, error occurs here
    this.years[0].year = "";
    this.years[0].colspan= 1;

    this.items.forEach( (item) => {
      //if the first entry.year is empty fill it with the year of the current object
      if (this.years[currentIndex].year) {
      //if it is already set and the years equal enlarge colspan  
      //otherwise go to the next entry with the "new" year
      if (this.years[currentIndex].year === String(item.year)) {
          this.years[currentIndex].colspan += this.columnKeys.length;
        } else {
          currentIndex++;
          this.years[currentIndex].year = String(item.year);
          this.years[currentIndex].colspan = this.columnKeys.length;
        }
      } else {
        this.years[currentIndex].year = String(item.year);
      }
    });
  }

Но при запуске ng serve я получаю следующий вывод:

AppComponent.html:1 ERROR TypeError: Cannot set property 'year' of undefined
    at TabularComponent.fillYearsArray (tabular.component.ts:27)
    at TabularComponent.push../src/app/tabular/tabular.component.ts.TabularComponent.ngOnInit (tabular.component.ts:22)
    at checkAndUpdateDirectiveInline (core.js:18537)
    at checkAndUpdateNodeInline (core.js:19801)
    at checkAndUpdateNode (core.js:19763)
    at debugCheckAndUpdateNode (core.js:20397)
    at debugCheckDirectivesFn (core.js:20357)
    at Object.eval [as updateDirectives] (AppComponent.html:1)
    at Object.debugUpdateDirectives [as updateDirectives] (core.js:20349)
    at checkAndUpdateView (core.js:19745)

Так чтоПохоже, что первый объект в массиве был бы неопределенным, но разве TS не должен знать, что у него есть свойство year, которое изменяется для объекта при первой записи моего years -array?

1 Ответ

0 голосов
/ 26 ноября 2018

Вам нужно добавить элемент, прежде чем изменить его значение.

вы пытаетесь получить доступ к

this.years[0]

, но длина this.years составляет 0

, поэтому вам нужносделайте это так

this.years.push({ year: "", colspan: 1});

, если вы хотите добавить элемент в ваш массив, вам нужно использовать функцию .push ().Если вы попытаетесь перейти к индексу, который хотите установить, он не будет работать

...