gpt4 book ai didi

typescript - 使用 Firestore 和 Typescript 的动态 Where 条件

转载 作者:行者123 更新时间:2023-12-05 02:08:28 26 4
gpt4 key购买 nike

我正在尝试使用 Firestore Firebase 和 TypeScript 实现存储库模式。

代码:

import { firestore } from "firebase-admin";
import { ISearchCriteria } from './ISearchCriteria'

//export class selectQuery<T> {
// constructor(private query: firestore.Query<T>) { }
//}

export class DBContext {
static current: DBContext = new DBContext();
private db: firestore.Firestore;

private constructor() {
this.db = firestore();
}

collection(collectionName: string): firestore.CollectionReference<firestore.DocumentData> {
return this.db.collection(collectionName);
}

public async where<T extends object>(collectionName: string, searchCriteria: ISearchCriteria[]): Promise<T[]> {
var snapShot = this.collection(collectionName);
for (var i = 0; i < searchCriteria.length; i++) {
snapShot = snapShot.where(searchCriteria[i].fieldName, searchCriteria[i].filterOp, searchCriteria[i].value);
}
let res = await snapShot.get();
return res.docs.map<T>(doc => ({ id: doc.id, ...doc.data() }) as T);
}


async get<T extends object>(collectionName: string): Promise<T[]> {
let res = await this.collection(collectionName).get();
return res.docs.map<T>(doc => ({ id: doc.id, ...doc.data() } as T));
}

async create<T extends object>(collectionName: string, item: T): Promise<T> {
return (await this.collection(collectionName).add(item)) as T;
}

async update<T extends object>(collectionName: string, id: string, item: T): Promise<firestore.WriteResult> {
var docRef = this.collection(collectionName).doc(id);
return await docRef.update(item);
}

async delete<T extends object>(collectionName: string, id: string): Promise<firestore.WriteResult> {
return await this.collection(collectionName).doc(id).delete();
}
}

我按照这里的例子:Firestore: Multiple conditional where clauses .

但我收到以下错误:dbcontext.ts:23:13 - error TS2740: Type 'Query<DocumentData>' is missing the following properties from type 'CollectionReference<DocumentData>': id, parent, path, listDocuments, and 2 more.它在下面提到的行中失败了

            snapShot = snapShot.where(searchCriteria[i].fieldName, searchCriteria[i].filterOp, searchCriteria[i].value);

ISearchCriteria:

    import { firestore } from "firebase-admin";
export interface ISearchCriteria {
fieldName: string | firestore.FieldPath,
filterOp: FirebaseFirestore.WhereFilterOp,
value: any
}

最佳答案

问题是您的 collection() 方法返回一个 CollectionReference,但是 where() 返回一个 Query。 TypeScript 告诉您不能将 Query 对象分配给 CollectionReference 变量。

如果您查看 API 文档,您会看到 CollectionReference实际上是 Query 的子类(它只返回集合中的所有文档)。当您调用 where() 时,您正在构建一个新的查询来过滤来自先前查询的文档。

尝试让您的 collection() 返回一个查询,这样您就可以安全地重新分配 snapShot:

collection(collectionName: string): firestore.Query<firestore.DocumentData> {
return this.db.collection(collectionName);
}

顺便说一句,您的名为 snapShot 的变量不是快照 - 它可能应该称为 query

关于typescript - 使用 Firestore 和 Typescript 的动态 Where 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60857851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com