Firestore 的 WriteBatch.update() 不会采用 angularfirestore2 的 AngularFirestoreDocument

Firestore's WriteBatch.update() won't take angularfirestore2's AngularFirestoreDocument

我正在尝试使用 Firestore 的 WriteBatch 进行批量写入。我正在尝试向 WriteBatch 添加更新,这需要 DocumentReference。我有一个 AngularFirestoreDocument,无法弄清楚如何将其转换为 DocumentReference 并使其正确编译或 运行。

我尝试将其转换为任何未知的 DocumentReference 并按原样使用 AngularFirestoreDocument。

export class FinancialService {
    private transCollection: AngularFirestoreCollection<Transaction>;

    batch_update_trans(trans) {
        let writer = this.afs.firestore.batch();
        this.transCollection = this.afs.collection<Transaction>('balance_sheets/'+this.balance_sheet_id+"/transactions/");
        for (let t of trans) {
          writer.update(this.transCollection.doc(id),t);
        }
        return writer.commit();
    }
}

如果我像上面那样包含 AngularFirestoreDocument,我会收到此编译时错误: 错误 TS2345:'AngularFirestoreDocument<{}>' 类型的参数不可分配给 'DocumentReference' 类型的参数。 类型 'AngularFirestoreDocument<{}>' 缺少类型 'DocumentReference' 的以下属性:id、firestore、parent、path 和另外 2 个。

如果我将 AngularFirestoreDocument 转换为 DocumentReference: writer.update(<DocumentReference>this.transCollection.doc(id),t);

我得到这个编译时错误: 错误 TS2352:类型 'AngularFirestoreDocument<{}>' 到类型 'DocumentReference' 的转换可能是一个错误,因为两种类型都没有充分重叠。如果这是故意的,请先将表达式转换为 'unknown'。 类型 'AngularFirestoreDocument<{}>' 缺少类型 'DocumentReference' 的以下属性:id、firestore、parent、path 和另外 2 个

如果我将 AngularFirestoreDocument 转换为未知的 DocumentReference: writer.update(<unknown> this.transCollection.doc(id),t); 它无法编译并出现此错误: 错误 TS2345:'unknown' 类型的参数不可分配给 'DocumentReference'.

类型的参数

如果我将 AngularFirestoreDocument 转换为 DocumentReference 到任何: writer.update(<any> this.transCollection.doc(id),t); 它确实可以编译,但是当我尝试以这种方式批量更新文档时出现 运行time 错误: 未捕获(承诺):FirebaseError: [code=invalid-argument]: Function WriteBatch.update() requires its first argument to be a DocumentReference, but it was: an object FirebaseError:函数 WriteBatch.update() 要求其第一个参数是 DocumentReference,但它是:一个对象

我期待代码能够编译并成功批量更新交易文档。

好的,我想出了如何使用这篇非常有用的文章来做到这一点,该文章提供了许多 angularfire2 本身没有的文档: Firestore Advanced Usage : angularfire - atomic writes

您可以通过 angularfire2 的 firestore 模块访问 javascript API 并通过该模块创建一个 DocumentRef API,而不是使用 angularfire2 的 AngularFirestoreDocument 类型。

工作代码如下所示:

export class FinancialService {

    batch_update_trans(trans) {
        let writer = this.afs.firestore.batch();
        let transDoc = null;
        for (let t of trans) {
          transDoc = this.afs.firestore.doc(
             'balance_sheets/'+this.balance_sheet_id+"/transactions/"+t.id);
          writer.update(transDoc,t);
        }
        return writer.commit();
    }
}