【问题标题】:Typescript: For in loop over objects won't recognise object's properties打字稿:对象循环中的 For 无法识别对象的属性
【发布时间】:2017-08-28 09:04:15
【问题描述】:

我正在使用for in 循环一个名为allMeetings 的会议对象列表。这个循环正在填充另一个名为allEvents 的列表,其中会议以外的对象最终会出现在该列表中。在该循环中,我试图获取会议对象的属性,但无法识别它们。我想知道如何解决或绕过它。

我的会议模式

export class Meeting {
    id: UUID;
    date: Date;
    description: string;
}

TS 文件
循环用于makeEvents() 方法

...
import { Meeting } from '../models/meeting.model';
import { MeetingsService } from '../services/meetings.service';
...
export class SomeComponent implements OnInit {
    allEvents: SpikesEvent[] = undefined;
    allMeetings: Meeting[] = undefined;

   constructor(private _meetingsService: MeetingsService) { }

    ngOnInit() {
        this.loadMeetings();
        this.makeEvents();
    }

    loadMeetings(): void {
        this._meetingsService.getAllMeetings().subscribe(
            (allMeetings: Meeting[]) => {
                this.allMeetings = allMeetings;
            }
        );
    }

    makeEvents(): void {
        for (let meeting in this.allMeetings) {
            this.allEvents.push({
                start: startOfDay(meeting.date),
                title: meeting.description,
                color: colors.yellowsunflower,
                type: "meeting",
                id: meeting.id,
            });
        }
    }
}

因此,会议的日期、描述和 ID 无法识别。

编辑 1:在 TS 文件中添加了构造函数。
编辑 2:我正在从 rethinkDB 检索我的数据,因此没有 JSON 文件,但这里有一个日志来证明会议对象实际上不是空的:

date: "Fri Feb 20 1993 00:00:00 GMT+00:00", description: "meeting about dummy data", id: "088c0baf-3c02-48b2-a072-65905fb0c0a7"

【问题讨论】:

标签: angular typescript properties for-in-loop


【解决方案1】:

把你的代码改成这个

ngOnInit() {
    this.loadMeetings();
}

loadMeetings(): void {
    this._meetingsService.getAllMeetings().subscribe(
        (allMeetings: Meeting[]) => {
            this.allMeetings = allMeetings;
            // you should call this function once 
            // we get the data in this.allMeetings
            this.makeEvents();
        }
    );
}

【讨论】:

  • 如果我的问题不够清楚,我很抱歉。我还没有考虑异步编程,只是想知道为什么 typeScript 不能识别这些属性。还是这些相关?
  • @Wouter Vanherck 是的,它们是相关的,用某个类声明一个对象不会给你类本身的原型。所以肯定会在 for 循环中遇到变量是未定义的,因为 allMeetings 对象本身在你的 observable 返回之前是未定义的
  • 按照您的方式进行了尝试,但这并没有改变出现Property 'id' does not exist on type 'string' 的事实,包括其他属性的错误。
  • 在会议类中将 id:number 更改为字符串或更改此 id:parseInt (meeting.id)。
  • @VivekDoshi a UUID 表示为字符串,因此不必担心更改它。
【解决方案2】:

有趣的是,每个人都错过了这样一个事实,即您正在使用 for ...in 迭代对象列表并尝试将键用作对象本身。

这就是 TypeScript “无法识别”它的属性的原因。如果你想使用for-in:

for (let meeting in this.allMeetings) {
    this.allEvents.push({
        start: startOfDay(this.allMeetings[meeting].date),
        //...
    });
}

我宁愿使用forEach

虽然关于异步代码的其他答案对于运行时执行仍然有效,但这不是您在此处询问的问题。

【讨论】:

  • 感谢您指出我的问题与异步主题有关。
【解决方案3】:

您需要像建议的那样操作回调中的数据。这是一个有用的问题:How do I return the response from an Observable/http/async call in angular2?

如前所述,您正在使用密钥作为对象,如建议的那样,请改用forEach。所以首先执行loadMeetings并在回调调用makeEvents内部:

ngOnInit() {
    this.loadMeetings();
}

loadMeetings(): void {
   this._meetingsService.getAllMeetings()
     .subscribe((allMeetings: Meeting[]) => {
         this.allMeetings = allMeetings;
            this.makeEvents();
        });
}

那么您的makeEvents 将如下所示:

makeEvents(): void {
  this.allMeetings.forEach((x:Meeting) => {
     this.allEvents.push({
       start: startOfDay(x.date),
       title: x.description,
       color: colors.yellowsunflower,
       type: "meeting",
       id: x.id,
     })
  })
}

那么它应该可以按你的意愿工作,这是一个

Demo

【讨论】:

  • 通过详细说明 @Alex 关于如何使用您帮助我的 foreach 的答案,谢谢。
  • 没问题!当您尝试执行makeEvents 因为您的代码现在位于该点时,只想提出您的allMeetings 将是未定义/空的问题,这将导致其他问题。但是,是的,这也许不是您手头的主要问题。最重要的是,您找到了解决问题的方法 :) 祝您有美好的一天,愉快的编码! :)
猜你喜欢
  • 2021-03-28
  • 2022-01-05
  • 2020-06-10
  • 2018-12-09
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多