我正在尝试使用Angular在Firebase的Firestore中的文档内的集合中删除文档及其嵌套文档。到目前为止,我可以删除所述文档和集合,但不是没有编译器向我发送错误error TS2339: Property 'id' does not exist on type '{}'
。错误代码可能是对还是错,我老实说不知道,因为我的代码确实找到了与我正在查看的对象相关联的id。这是我的代码:
testID: string;
private testDoc: AngularFirestoreDocument<Test>;
constructor(private db: AngularFirestore) { }
deleteDoc() {
console.log('Deleting test');
this.db.collection(`tests/${this.testID}/questions`, ref => ref.orderBy('order'))
.valueChanges().subscribe(questions => {
questions.map(question => {
this.db.doc(`tests/${this.testID}/questions/${question.id}`).delete()
.catch(error => {console.log(error); })
.then(() => console.log(`tests/${this.testID}/questions/${question.id}`));
});
});
this.testDoc.delete().catch(error => console.log(error));
}
我试图在map函数中传递2个参数,但这只会在执行的函数而不是编译器中抛出错误,从而使代码根本不起作用(我可能不会在这里传递正确的东西)。
正如我所提到的,我的代码有效,但我肯定做错了什么。所以我的问题是,我做错了什么来触发编译错误,如何在确保函数仍然有效的同时避免这种情况?希望有人可以帮助澄清我在这里做错了什么。
提前谢谢。
*编辑,包括我正在查看的文档
export interface Question {
description: string;
order: number;
type: string;
id: string;
name: string;
options?: Object[];
radio_amount?: number;
current_chips?: Object[];
imageURL?: string;
}
答案 0 :(得分:2)
我认为我错过了我正在查看的变量的类型,但我不知道如何在箭头函数中声明该变量的类型,因为尝试将外部变量包含到函数中对我来说不起作用
我通过添加我的代码中显示的类型修复了我的错误。现在代码就像以前一样工作,它不会给我一个编译器错误。
deleteDoc() {
this.db.collection(`tests/${this.testID}/questions`,
ref => ref.orderBy('order')).valueChanges().subscribe(questions => {
questions.map((question: Question) => {
this.db.doc(`tests/${this.testID}/questions/${question.id}`).delete()
.catch(error => {console.log(error); })
.then(() => console.log(`Deleting question (${question.id}) in (${this.testID})`));
});
});
this.testDoc.delete().catch(error => console.log(error)).then(() => console.log(`${this.testID} has been deleted.`));
}
我很感谢你们中的一些人试图给我的帮助,但是你似乎更专注于我的代码在从未出现过这种情况或问题时无效的事实。重点是我在编译器抛出的问题中指定的错误,尽管函数正常工作以及如何正确编写代码以避免错误。
快速抬头,我不建议使用上面提到的功能,因为当订阅问题集时,它当前正在运行,因此当我在函数中删除文档时值的变化也会运行代码几次。它有效,但没有优化。