Свойство объекта углового машинописного текста явно не определено, но свойство

#angular #typescript #undefined

Вопрос:

У меня довольно нелепая проблема.

Объект из подписанного наблюдаемого явно содержит данные при печати на консоль, но в фактическом коде машинописи говорится, что он не определен.

Убедитесь в этом сами:

 initData(): void {   this.backendService.getData().subscribe((depotDays: DepotDayAcc[]) =gt; {   console.log(depotDays)  console.log(depotDays[0])  console.log(depotDays[0].investment)  console.log(depotDays[0]["day"])   console.log('depotDays[0] == undefined', depotDays[0] == undefined)  console.log('depotDays[0].investment == undefined', depotDays[0].investment == undefined)  }) }  

введите описание изображения здесь

 constructor(  public day: Date,  public investment: number = -1,  public profit: number = 0,  public value: number = 0,  public percent: number = 0,  public tickers: Setlt;stringgt; = new Setlt;stringgt;()) { }  

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

1. Вы не опубликовали никаких подробностей машинописного сообщения, а именно, на какую строку вы ссылаетесь.

2. Откуда поступают ваши данные JSON.parse ? Если это так, то помните, что ваш класс constructor , который вы опубликовали, не будет вызван , поэтому эти свойства не будут установлены, если они не находятся в JSON. При использовании JSON.parse (без пользовательской логики регидратации) вы должны использовать interface для описания ожидаемых данных. (Действительно, для меня этот tickers элемент выглядит как an Arraylt;Stringgt; , а не Set как (в противном случае вместо этого показывался бы Chrome "tickers": Set(1) ["ADSK"] .

3. Также, машинопись тип системы базируется тип стирания : это в основном прославленный практического типа времени компиляции попробует: это не имеет типа времени выполнения-система — поэтому каждый раз, когда вы используете во время выполнения типа утверждений вы потеряете жесткого гарантирует, что TypeScript предоставляет (и вы должны использовать тип-с утверждения JSON.parse , если вы напишите типа-охранников.

4. Потому depotDays[0] что это строка, а не объект. Ваш сервер, вероятно, дважды кодирует его как json

Ответ №1:

Как отметил Шампушэм в своем комментарии, все ваши данные являются строками. У вас есть массив строк, а не объектов.

 const depotDay = JSON.parse(depotDays[0]); console.log(depotDay.investment);  

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