Firebase+TypeScript类型导入最佳实践及TSLint依赖问题咨询
刚好我之前也碰到过和你一模一样的问题——代码跑起来没问题,但TSLint总揪着依赖缺失的警告不放,给你梳理几个靠谱的解决方案和最佳实践:
为什么会出现这个问题?
你的代码能正常运行,是因为Firebase Admin SDK或者Cloud Functions SDK已经间接依赖了@google-cloud/firestore,项目里其实已经有这个包了。但TSLint的no-implicit-dependencies规则要求:所有直接导入的模块必须在package.json里显式声明,不管它是直接还是间接依赖的,所以就触发了这个警告。
推荐的解决方案
方案1:从Firebase Admin SDK导入类型(最推荐)
Firebase Admin SDK已经把@google-cloud/firestore的类型重新导出了,你完全可以直接从firebase-admin/firestore导入这些类型,不用碰@google-cloud/firestore:
import { DocumentSnapshot, DocumentReference, QuerySnapshot, WriteResult, Transaction, WriteBatch } from 'firebase-admin/firestore';
这样做的好处:
- 不用额外安装任何依赖,
firebase-admin肯定已经在你的package.json里了(写Cloud Functions肯定要用它) - 完全符合Firebase官方的使用规范,不会有依赖版本不一致的风险
- TSLint的警告直接消失
方案2:显式安装@google-cloud/firestore作为开发依赖
如果你确实需要直接从@google-cloud/firestore导入类型(比如某些特定API只有这个包有),可以把它安装为开发依赖——因为运行时Firebase已经提供了这个包,你只是用它的类型定义:
# npm npm install --save-dev @google-cloud/firestore # yarn yarn add -D @google-cloud/firestore
安装后,package.json里就会有这个依赖的记录,TSLint的警告自然就没了,类型提示也能正常工作。
方案3:让TSLint忽略这个模块(不推荐)
如果只是想快速关掉警告,可以在tslint.json里给no-implicit-dependencies规则加个例外:
{ "rules": { "no-implicit-dependencies": [true, ["@google-cloud/firestore"]] } }
不过这个方案不太推荐,因为它会掩盖真正的依赖问题——比如如果哪天Firebase SDK不再依赖这个包了,你的代码可能会在运行时出错,而TSLint不会提醒你。
总结
优先选方案1,贴合Firebase生态还不用额外折腾;如果有特殊需求再用方案2;方案3尽量少用,除非你很清楚自己在做什么。
内容的提问来源于stack exchange,提问作者Kim

