打字稿:对于 objects 的循环将无法识别 object 的属性
Typescript: For in loop over objects won't recognise object's properties
我正在使用 for in
遍历名为 allMeetings
的 Meeting-objects 列表。此循环正在填充另一个名为 allEvents
的列表,其中 objects 除了 Meeting 将结束。在该循环中,我试图获取 Meeting object 的属性,但它们不被认可。请问如何解决或绕过
我的会议模型:
export class Meeting {
id: UUID;
date: Date;
description: string;
}
TS-File:
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-File 中添加了构造函数。
编辑 2:我正在从 rethinkDB 检索我的数据,所以没有 JSON-file 但这里有一个日志来证明会议 object 实际上不为空:
date: "Fri Feb 20 1993 00:00:00 GMT+00:00", description: "meeting about dummy data", id: "088c0baf-3c02-48b2-a072-65905fb0c0a7"
将您的代码更改为此
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();
}
);
}
有趣的是,每个人都没有注意到您正在使用 for ...in 迭代对象列表并尝试将键用作对象本身。
这就是为什么 TypeScript "won't recognize" 它的属性。如果你想使用 for-in:
for (let meeting in this.allMeetings) {
this.allEvents.push({
start: startOfDay(this.allMeetings[meeting].date),
//...
});
}
我宁愿使用 forEach。
关于异步代码的其他答案虽然对运行时执行仍然有效,但这不是您在这里询问的问题。
您需要按照建议在回调中操作数据。这是一个有用的问题:
如前所述,您正在使用键作为对象,按照建议,改为使用 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
我正在使用 for in
遍历名为 allMeetings
的 Meeting-objects 列表。此循环正在填充另一个名为 allEvents
的列表,其中 objects 除了 Meeting 将结束。在该循环中,我试图获取 Meeting object 的属性,但它们不被认可。请问如何解决或绕过
我的会议模型:
export class Meeting {
id: UUID;
date: Date;
description: string;
}
TS-File:
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-File 中添加了构造函数。
编辑 2:我正在从 rethinkDB 检索我的数据,所以没有 JSON-file 但这里有一个日志来证明会议 object 实际上不为空:
date: "Fri Feb 20 1993 00:00:00 GMT+00:00", description: "meeting about dummy data", id: "088c0baf-3c02-48b2-a072-65905fb0c0a7"
将您的代码更改为此
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();
}
);
}
有趣的是,每个人都没有注意到您正在使用 for ...in 迭代对象列表并尝试将键用作对象本身。
这就是为什么 TypeScript "won't recognize" 它的属性。如果你想使用 for-in:
for (let meeting in this.allMeetings) {
this.allEvents.push({
start: startOfDay(this.allMeetings[meeting].date),
//...
});
}
我宁愿使用 forEach。
关于异步代码的其他答案虽然对运行时执行仍然有效,但这不是您在这里询问的问题。
您需要按照建议在回调中操作数据。这是一个有用的问题:
如前所述,您正在使用键作为对象,按照建议,改为使用 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,
})
})
}
那么它应该可以如你所愿地工作,这里是