【问题标题】:Angular Typescript object property is clearly not undefined but property isAngular Typescript 对象属性显然不是未定义的,但属性是
【发布时间】: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&lt;String&gt;,而不是 Set(否则 Chrome 会显示 "tickers": Set(1) 而不是 ["ADSK"]
  • 另外,TypeScript 的类型系统是基于 type erasure:它本质上是一个美化的 practical 编译时类型证明器:它是 不是运行时类型系统 - 因此,每当您使用运行时类型断言时,您都会失去 TypeScript 提供的硬保证(除非您编写类型保护,否则您必须使用带有 JSON.parse 的类型断言。跨度>
  • 因为depotDays[0] 是一个字符串,而不是一个对象。您的后端可能将其编码为 json 两次

标签: angular typescript undefined


【解决方案1】:

正如 ShamPooSham 在他的评论中指出的那样,您的数据都是字符串。你有一个字符串数组,而不是对象。

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

选择是修复有效负载以使其正确反序列化,或自行反序列化每个条目。

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2018-08-09
    • 2018-07-24
    相关资源
    最近更新 更多