typescript Angular无法访问类型脚本中变量的属性

li9yvcax  于 2023-01-18  发布在  TypeScript
关注(0)|答案(2)|浏览(139)

我有以下代码:

data:IQuest[]|any=[];

ngOnInit(){
this.getData();
console.log(this.data[1].Question);
}

getData(){     
  let url = "http://127.0.0.1:5153/Quests";
  this.http.get(url).subscribe(data=>{
  this.data=data;     
});
}

export interface IQuest {
Id: number,
lat: number,
lon: number,
Question:string,
}

我无法访问typescript中data属性内的值,例如,当我调用console.log时,就像上面的代码一样,我会收到如下错误:

ERROR TypeError: Cannot read properties of undefined (reading 'Question')
at AppComponent.ngOnInit (app.component.ts:32:30)

另一方面,当我想在html中显示值时,它们显示正确,访问没有问题,例如:

<div *ngFor="let element of data">
  {{element.question}}
</div>

它把属性的值一个列在另一个的下面。那么为什么我不能在TypeScript中访问这些值呢?

tv6aics1

tv6aics11#

可以尝试移除数据定义中的|any。或者在填充时像this.data=data as IQuest[];一样强制转换它

368yc8dk

368yc8dk2#

您的代码中存在一些问题,有些问题已经被其他人提到过。

  1. this.data[1]正在访问数组中的第二个元素,该元素可能与您的html不同(如果您只返回1个项目)。
  2. html访问question(小写q),而 typescript 访问Question(大写Q)。
    1.正如@Fussel提到的,您正在异步加载数据,这意味着在您执行console.log时,this.data = data可能尚未执行。请将console.log直接移动到订阅中this.data = data的下方。
    看一下你发布的另一个问题(Angular TypeScript cannot read properties of undefined error)。数字3可能是这个错误的原因,当它被修复时,数字2可能是你的下一个错误:)。调试器显示你实际上返回了一个带有question(小写q)变量的对象。这也意味着你的IQuest定义是错误的(Id属性(大写I)也是如此)。
    其他一些需要注意的事项包括:说this.dataIQuest[]并不意味着它实际上是。如果你从HttpClient返回其他东西,那么javascript会把它放在那个变量中。
    另外,正如@Nando IQuest[]|any所提到的,这意味着变量是IQuest[]或可能是其他任何东西。这不会解决您的问题,因为这是编译时由typescript使用的东西,您的错误是由javascript在运行时生成的,但最好更改它,并删除|any部分。

相关问题