Dynami c, где условия с Firestore и Typescript - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь реализовать шаблон репозитория с 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: несколько условных выражений where .

Но я получаю следующую ошибку: 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
    }

1 Ответ

1 голос
/ 26 марта 2020

Проблема в том, что ваш метод 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...