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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:59:50