You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase+TypeScript参数查询时出现类型错误求助

解决Firebase Firestore结合TypeScript的查询类型错误问题

核心错误原因

你代码里的query函数导入错了模块——当前是从firebase/database(实时数据库模块)导入的,但实际用的是Firestore,应该从firebase/firestore导入。两个模块的query类型完全不兼容,直接导致了类型匹配失败。

具体修复步骤

  1. 修正query的导入路径
    把:

    import { query } from 'firebase/database';
    

    替换成:

    import { query } from 'firebase/firestore';
    
  2. 优化类型定义(可选,提升类型严谨性)
    为避免unknown和DocumentData的模糊匹配,可以给集合和返回结果添加泛型约束,适配不同集合的数据结构:

    • 给ISearchParams的value匹配具体业务类型
    • 用泛型统一集合和文档的类型关联

修改后的完整代码示例

import { injectable } from 'tsyringe';
import { firestore } from '@/firebase/firestore';
import { 
    CollectionReference, 
    DocumentData, 
    DocumentReference, 
    DocumentSnapshot, 
    Firestore, 
    QuerySnapshot, 
    WhereFilterOp, 
    addDoc, 
    doc, 
    getDoc, 
    getDocs, 
    setDoc, 
    where,
    query // 修正:从firestore导入query
} from 'firebase/firestore';

interface ISearchParams {
    param: string;
    operation: WhereFilterOp;
    value: unknown;
}

// 可选:定义通用文档结构,适配不同业务集合
interface BaseDocument extends DocumentData {
    createdAt?: Date;
    updatedAt?: Date;
}

@injectable()
export class FirestoreService {
    private readonly db: Firestore = firestore;

    async createWithCustomId<T extends BaseDocument>(collection: string, customId: string, data: T): Promise<void> {
        return await setDoc(doc(this.db, collection, customId), data);
    }

    async createWithRandomId<T extends BaseDocument>(collection: CollectionReference<T>, data: T): Promise<DocumentReference<T>> {
        return await addDoc(collection, data);
    }

    async findById<T extends BaseDocument>(collection: string, documentId: string): Promise<DocumentSnapshot<T>> {
        return await getDoc(doc(this.db, collection, documentId));
    }

    async findByParams<T extends BaseDocument>(collection: CollectionReference<T>, params: ISearchParams[]): Promise<QuerySnapshot<T>> {
        const wheres = params.map(w => where(w.param, w.operation, w.value));
        const q = query(collection, ...wheres);
        return await getDocs(q);
    }
}

关于集合实例调用query的问题

Firestore的query是顶级工具函数,不是CollectionReference的实例方法,所以不能通过userCollection.query(...)调用,正确用法是把集合作为第一个参数传入query函数,比如:

import { collection, query, where } from 'firebase/firestore';
import { db } from './firebase-config';

const userCollection = collection(db, "users");
const q = query(userCollection, where("age", ">", 18));

内容的提问来源于stack exchange,提问作者Gabriel Jerônimo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:46:27