Firebase云函数调用Firestore withConverter报类型不匹配错误如何解决
问题根因
你混用了客户端Firebase SDK和Admin Firebase SDK的类型定义,Admin SDK的FirestoreDataConverter接口和客户端SDK的接口存在差异:
- Admin SDK的
fromFirestore方法只接收1个snapshot参数,不需要第二个options参数 - 你定义转换器时用了客户端SDK的类型,和Admin SDK要求的类型不匹配,所以触发了TS类型报错
解决方案
1. 清理无用依赖
云函数运行在服务端,不需要引入客户端Firebase SDK相关包,删除以下导入语句:
import * as firebase from 'firebase/app'; import 'firebase/auth'; import 'firebase/firestore';
2. 修正数据转换器定义
给转换器显式指定Admin SDK的FirestoreDataConverter类型,修改fromFirestore方法签名,删除多余的options参数:
const familyRequestConverter: admin.firestore.FirestoreDataConverter<FamilyRequest> = { toFirestore(famrequest: FamilyRequest): admin.firestore.DocumentData { return { recipient: famrequest.recipient, sender: famrequest.sender, familyId: famrequest.familyId, role: famrequest.role, senderIsModGuard: famrequest.senderIsModGuard }; }, fromFirestore( snapshot: admin.firestore.QueryDocumentSnapshot ): FamilyRequest { const data = snapshot.data()!; return new FamilyRequest(data.recipient, data.sender, data.familyId, data.role, data.senderIsModGuard); } };
3. 优化数据获取逻辑
使用转换器后,调用doc.data()会直接返回你定义的FamilyRequest类型实例,不需要额外转换:
const doc = await db.collection("famrequests") .doc(uid) .collection('myfamrequests') .doc(famrequestrecipient) .withConverter(familyRequestConverter) .get(); if (doc.exists) { // 直接获取FamilyRequest实例,TS会自动推断类型 const famRequest = doc.data(); }
内容的提问来源于stack exchange,提问作者Willem Ghijsen
相关产品推荐
相关产品推荐

