#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
элемент выглядит как anArraylt;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);
Выбор состоит в том, чтобы либо исправить полезную нагрузку, чтобы она была десериализована должным образом, либо десериализовать каждую запись самостоятельно.