Выдвиньте объект во вложенный массив Typescript, получите ошибку: невозможно прочитать свойство «push» из неопределенного - PullRequest
0 голосов
/ 10 марта 2019

Я немного искал SO, пытаясь решить эту проблему, но мой код, кажется, немного выходит за рамки стандартного «выталкивания объекта в массив».

У меня есть интерфейс, который вводит свойство "Год" с другим интерфейсом в виде массива:

   export interface IUser {
        Nickname: string;
        FirstName: string;
        LastName: string;
        Email: string;
        EmergencyContact: string;
        EmergencyNumber: string;
        Year: Array<IYear>;
        IsTeacher: boolean;
        IsAdmin: boolean;
        Uid: string;
    }

    export interface IYear {
        CalendarYear: string;
        PassType: string;
        UserItinerary: IItinerary;
        WaiverStatus: boolean;
        Guests: Array<IGuest>;
        SignupDate: string;
    }

В определенный момент я собираюсь передать некоторые данные formGroup в типизированное свойство IYear:

user: IUser = <IUser>{};

createUser(
    firstName: string,
    lastName: string,
    email: string,
    uid: string,
    isTeacher: boolean,
    passType: string) {
    const year: IYear = {
      CalendarYear: this.calendarYear,
      PassType: passType,
      UserItinerary: {} as IItinerary,
      WaiverStatus: false,
      Guests: [],
      SignupDate: this.dateTime
    }
    this.user.FirstName = firstName;
    this.user.LastName = lastName;
    this.user.Email = email;
    this.user.Uid = uid;
    this.user.IsTeacher = isTeacher;
    this.user.IsAdmin = false;
    this.user.Year.push(year);

    return this.user;
  }

Проблема в том, что когда я пытаюсь передать свойство 'year' внутри createUser в массив 'this.user.Year', я получаю ошибку

Невозможно прочитать свойство 'push' из неопределенного

Я пытался явно передать значения ключом:

this.user.Year['CalendarYear'] = year.CalendarYear;

Но это не сработало. Кто-нибудь может указать на мою ошибку здесь?

Ответы [ 4 ]

3 голосов
/ 10 марта 2019

Массив Year в пользовательском объекте должен быть инициализирован пустым, прежде чем помещать в него объекты.

this.user.Year = [];

, а затем

this.user.Year.push(year);
2 голосов
/ 10 марта 2019

Причина, по которой вы получаете ошибку, заключается в том, что вам нужно сначала инициализировать массив , а затем вы можете push() значения к нему.

  • Либо инициализировать новый IUser с year = [{your year}] и , затем вы можете добавить к нему больше значений.
  • Или инициализировать новый объект IUser с пустым годом массива, а затем Вы можете добавить значения к нему.
1 голос
/ 10 марта 2019

вы инициализировали свой массив перед его использованием.

user: IUser = <IUser>{};    
createUser(
    firstName: string,
    lastName: string,
    email: string,
    uid: string,
    isTeacher: boolean,
    passType: string) {
    const year: IYear = {
      CalendarYear: this.calendarYear,
      PassType: passType,
      UserItinerary: {} as IItinerary,
      WaiverStatus: false,
      Guests: [],
      SignupDate: this.dateTime
    }
    this.user.FirstName = firstName;
    this.user.LastName = lastName;
    this.user.Email = email;
    this.user.Uid = uid;
    this.user.IsTeacher = isTeacher;
    this.user.IsAdmin = false;
    this.user.Year=[];
    this.user.Year.push(year);    
    return this.user;
  }
0 голосов
/ 10 марта 2019

Необходимо убедиться, что Year присутствует в объекте пользователя, а также CalendarYear присутствует в Year объекте

...