打字稿遍历对象似乎不起作用(类型错误)

时间:2020-06-18 15:33:07

标签: angular typescript

我正在尝试一段时间,但无法正常工作。

我正在尝试遍历对象中的数组(已导入接口):

export interface Ex {
    _id: string;
    name: string;
    tags: [
        {
            label: string,
            count: number,
            updateInfo: [
                {
                    date: string,
                    delay: number,
                }
            ],
        }
    ];
}

基本上,我正在尝试将所有标签标签放入字符串数组中。

getTags(): void {
    for (let tag in this.ex.tags) {
      this.tags.push(tag.label)
    }
}

或类似这样:

getTags(): void {
    this.ex.tags.forEach(tag => {
      this.tags.push(tag.label);
    });
  }

但是我得到了错误:

core.js:6228错误TypeError:无法读取未定义的属性“标签”

1 个答案:

答案 0 :(得分:0)

您已定义tags,但尚未实例化/或未分配给它:

将该属性添加为:

tags = [];

tags = new Array<string>();

应解决该问题。

此外,您可以略微简化逻辑:

this.tags = this.exTags.tags.map(x => x.label);

And an example of what I see

    export class AppComponent implements OnInit  {
  name = 'Angular ' + VERSION.major;

  getTags() :Observable<Ex>{
    return new Observable(ob => {
      setTimeout(() => {
        ob.next({
            id :"a",
    name: "a name",
    tags: [
      {
      label:"a label",
      count:1,
      updateInfo: [
        {
        date: new Date().toString(),
        delay:5
        }
      ]
    },
    {
      label:"b label",
      count:1,
      updateInfo: [
        {
        date: new Date().toString(),
        delay:5
        }
      ]
    }

    ] 
        })
      },1000)

    })
  }

  exTags: Ex;

  tags = new Array<string>();
  ngOnInit(){
      this.getTags().subscribe(s => { this.tags = s.tags.map(x => x.label)});
  }

}

export class Tag{
  label: string;
  count: number;
  updateInfo: [
          {
          date: string,
          delay: number
          }
    ]
}
export interface Ex {
        id: string,        
        name: string,
        tags: Tag[]
}

修改


由于具有可观察对象,因此需要等待get请求完成。我在异步对象上模拟了一个网络超时的超时(更新了Stackblitz)

那么您所需要做的就是调用AJAX / Observable上的subscription方法:

this.getTags().subscribe(s => { this.tags = s.tags.map(x => x.label)});