如何为Firebase Functions V2处理器添加自定义Video类型?
解决Firestore触发器中类型any的问题
步骤1:定义明确的类型接口
先把Video和对应的Disposable结构用TypeScript接口描述清楚,获得完整的类型提示和检查:
// 单个可删除存储资源的结构 interface Disposable { bucket: string; object: string; } // Firestore中videos文档对应的类型 interface Video { disposables: Disposable[]; // 可补充videos文档的其他字段,比如title、uploadTime等 }
步骤2:给FirestoreEvent指定泛型类型
修改函数的event参数类型,将QueryDocumentSnapshot替换为带泛型的QueryDocumentSnapshot<Video>,这样event.data.data()会自动推导为Video类型,disposables也会变成Disposable[],不再是any:
import { FirestoreEvent, QueryDocumentSnapshot } from 'firebase-functions/v2/firestore'; export async function onDeleteVideo(event: FirestoreEvent<QueryDocumentSnapshot<Video>, { uid: string }>): Promise<void> { if (!event?.data) { return; } const { disposables } = event.data.data()!; for (const disposable of disposables) { try { await storage.bucket(disposable.bucket).file(disposable.object).delete(); } catch (err) { console.error(`删除存储对象失败: ${disposable.bucket}/${disposable.object}`, err); } } }
备选方案:类型断言
如果无法修改FirestoreEvent的泛型,可直接用类型断言把data()结果转为Video类型:
export async function onDeleteVideo(event: FirestoreEvent<QueryDocumentSnapshot, { uid: string }>): Promise<void> { if (!event?.data) { return; } const videoData = event.data.data() as Video; const { disposables } = videoData; for (const disposable of disposables) { try { await storage.bucket(disposable.bucket).file(disposable.object).delete(); } catch (err) { console.error(`删除存储对象失败: ${disposable.bucket}/${disposable.object}`, err); } } }
导出部分无需修改
原触发器导出代码保持不变:
export const onDeleteVideo = onDocumentDeleted('videos/{uid}', triggers.onDeleteVideo);
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

