- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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/
我是一名优秀的程序员,十分优秀!