【发布时间】:2021-10-30 20:52:12
【问题描述】:
我遇到了一个相当荒谬的问题。
订阅的 observable 中的对象在将其打印到控制台时清楚地包含其中的数据,但在实际的打字稿代码中,它是未定义的。
自己看看:
initData(): void {
this.backendService.getData().subscribe((depotDays: DepotDayAcc[]) => {
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: Set<string> = new Set<string>()) {
}
【问题讨论】:
-
您尚未发布 TypeScript 消息的任何详细信息 - 即 您指的是哪一行。
-
您的数据是否来自
JSON.parse?如果是这样,请记住您发布的类constructor将不会被调用 - 因此除非它们在 JSON 中,否则不会设置这些属性。当使用JSON.parse(没有自定义补液逻辑)时,您必须使用interface来描述您期望的数据。 (实际上,tickers成员在我看来像Array<String>,而不是Set(否则 Chrome 会显示"tickers": Set(1)而不是["ADSK"]。 -
另外,TypeScript 的类型系统是基于 type erasure:它本质上是一个美化的 practical 编译时类型证明器:它是 不是运行时类型系统 - 因此,每当您使用运行时类型断言时,您都会失去 TypeScript 提供的硬保证(除非您编写类型保护,否则您必须使用带有
JSON.parse的类型断言。跨度> -
因为
depotDays[0]是一个字符串,而不是一个对象。您的后端可能将其编码为 json 两次
标签: angular typescript undefined