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
相关产品推荐
相关产品推荐

