TypeScript编写Puppeteer转译CommonJS时遇TS2420错误求助
解决Firebase Functions TypeScript转译时TS2420错误的方案
这个错误我之前也碰到过,本质是firebase-functions和firebase-admin的类型定义版本不匹配导致的接口实现冲突——UserRecordMetadata(来自firebase-functions)和UserMetadata(来自firebase-admin)的属性定义不一致,才会报"lastSignedInAt缺失"的错误。下面是具体的解决步骤:
1. 统一firebase-functions和firebase-admin的版本
这是最核心的解决办法,两个包的版本必须严格匹配,否则类型定义很容易出现冲突:
- 先查看当前安装的版本:
npm list firebase-functions firebase-admin - 卸载现有版本,重新安装兼容的版本组合(推荐安装最新稳定版,或者官方文档指定的配套版本):
如果最新版还是有问题,可以尝试指定已知兼容的版本对,比如:npm uninstall firebase-functions firebase-admin npm install firebase-functions@latest firebase-admin@latestnpm install firebase-functions@4.5.0 firebase-admin@11.11.0
2. 清理缓存和编译输出
有时候旧的编译缓存会干扰新的类型检查,清理后重新编译:
- Linux/macOS:
rm -rf node_modules/.cache dist && tsc -p config.json - Windows:
rmdir /s /q node_modules\.cache dist && tsc -p config.json
3. 检查tsconfig.json配置
确保你的TypeScript配置符合Firebase Functions的要求:
- 确认
compilerOptions里的module设置为CommonJS,target设置为Firebase支持的Node.js版本对应的ES标准(比如Node.js 16+对应ES2017); - 确保
types数组包含两个包的类型定义,示例配置片段:{ "compilerOptions": { "module": "CommonJS", "target": "ES2017", "types": ["firebase-functions", "firebase-admin"], "outDir": "dist" } }
4. 临时绕过方案(不推荐长期使用)
如果以上步骤都没解决,你可以用类型断言临时绕过类型检查,但这只是权宜之计,还是建议优先解决版本匹配问题:
import * as admin from "firebase-admin"; import { UserRecordMetadata } from "firebase-functions/lib/providers/auth"; // 在使用时进行类型断言 const userRecord = await admin.auth().getUser("user-uid"); const metadata = userRecord.metadata as unknown as UserRecordMetadata;
另外补充一句:现在Firebase Functions支持的Node.js运行时(16、18、20版本)都已经原生支持async/await了,如果你的项目还在使用旧版本的Node.js运行时,建议升级到官方支持的最新版本,这样甚至可以直接用JavaScript编写代码,不需要转译TypeScript。
内容的提问来源于stack exchange,提问作者Relm
相关产品推荐
相关产品推荐

