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

React Native:如何获取Firebase Analytics方法参数类型适配rest参数?

解决Expo环境下React Native Firebase Analytics通用调用函数的TypeScript类型报错

问题分析

你遇到的报错核心原因是:FirebaseAnalyticsTypes.Module中并非所有属性都是函数类型,泛型F包含了非函数类型的键,导致Parameters<FirebaseAnalyticsTypes.Module[F]>无法满足“仅接受函数类型”的约束。同时analytics变量未指定类型,也会导致后续调用的类型推断问题。

解决方案

1. 过滤出仅包含函数的键类型

先定义一个类型,筛选FirebaseAnalyticsTypes.Module中值为函数的所有键,确保泛型仅接受方法名:

type AnalyticsFunctionKeys = {
  [K in keyof FirebaseAnalyticsTypes.Module]: FirebaseAnalyticsTypes.Module[K] extends (...args: any[]) => any 
    ? K 
    : never;
}[keyof FirebaseAnalyticsTypes.Module];

2. 为analytics变量指定正确类型

明确analytics是返回Firebase Analytics实例的函数(或undefined,因为Expo Go环境下不会初始化):

import { FirebaseAnalyticsTypes } from '@react-native-firebase/analytics';
import type analytics from '@react-native-firebase/analytics';

let analytics: typeof analytics | undefined;
if (!isExpoGo) {
    analytics = require('@react-native-firebase/analytics').default;
}

3. 修改通用调用函数的泛型约束

将泛型F的约束改为上面定义的AnalyticsFunctionKeys,确保传入的fnName一定是方法名,Parameters就能正确提取参数类型。

完整代码

import { FirebaseAnalyticsTypes } from '@react-native-firebase/analytics';
import type analytics from '@react-native-firebase/analytics';

import { isExpoGo } from '~/environment';

// 筛选出Module中所有函数类型的键
type AnalyticsFunctionKeys = {
  [K in keyof FirebaseAnalyticsTypes.Module]: FirebaseAnalyticsTypes.Module[K] extends (...args: any[]) => any 
    ? K 
    : never;
}[keyof FirebaseAnalyticsTypes.Module];

let analytics: typeof analytics | undefined;
if (!isExpoGo) {
    analytics = require('@react-native-firebase/analytics').default;
}

/**
 * 调用Firebase Analytics函数。
 */
export const analyticsFn = async function <F extends AnalyticsFunctionKeys>(
  fnName: F, 
  ...rest: Parameters<FirebaseAnalyticsTypes.Module[F]>
) {
    console.log('Analytics:', fnName, ...rest);
    if (isExpoGo || !analytics) return;
    return await analytics()[fnName](...rest);
};

额外说明

  • 添加了!analytics的判断,避免在初始化失败时调用函数导致运行时错误
  • 通过typeof analytics直接复用库导出的类型,无需手动声明复杂的函数类型

内容的提问来源于stack exchange,提问作者cr0ybot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:16:20