【问题标题】:How do you import Firebase Auth, Firestore and Firebase Storage node packages as well as their TypeScript's types in a class?如何在一个类中导入 Firebase Auth、Firestore 和 Firebase Storage 节点包以及它们的 TypeScript 类型?
【发布时间】:2020-12-14 14:19:54
【问题描述】:

我需要导入 Firebase 包并将它们放入一个必须与 Next.js 和 React Native 兼容的模块的类中。这对于 React Native 版本非常有效,但我不太习惯使用 TypeScrit 进行 React 并遇到一些问题。

设置:

  • VS 代码
  • TypeScript 3.9
  • TSLint 5
  • Lerna multirepo + Yarn 工作区:
  • @project/apps 通用包(我们在这里)
  • 使用此文件的带有 next.js 的 @project/web 包
  • 一个用于 React native 的 @project/mobile 包,使用此文件的 .native.ts 版本

这里是 tsconfig.json:

{
  "compilerOptions": {
    "noImplicitAny": false,
    "noUnusedLocals": true,
    "removeComments": true,
    "noLib": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "sourceMap": true,
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "declaration": true
  },
  "exclude": ["node_modules", "**/*.spec.ts", "**/__tests__/*", "babel.config.js", "metro.config.js", "jest.config.js"]
}

这里是 tslint.json:

{
  "extends": ["tslint:recommended", "tslint-config-prettier"],
  "rules": {
    "object-literal-sort-keys": false,
    "interface-name": false,
    "member-access": [true, "no-public"],
    "ordered-imports": false,
    "no-console": false
  }
}

这是 Firebase 类的代码:

import app from '@firebase/app'
import { FirebaseApp } from '@firebase/app-types'
import '@firebase/firestore'
import { FirebaseFirestore } from '@firebase/firestore-types'
import '@firebase/auth'
import { FirebaseAuth } from '@firebase/auth-types'
import '@firebase/storage'
import { FirebaseStorage } from '@firebase/storage-types'

import firebaseConfig from './config'

export class Firebase {
  app: FirebaseApp
  auth: FirebaseAuth
  db: FirebaseFirestore
  firestore: FirebaseFirestore
  files: FirebaseStorage

  constructor() {
    app.initializeApp(firebaseConfig)
    this.app = app.app()
    this.auth = app.auth()
    this.db = app.firestore()
    this.firestore = app.firestore
    this.files = app.storage()
  }
}

const firebase = new Firebase()
export default firebase

我有几个问题:

@firebase/firestore 导入时:

Could not find a declaration file for module '@firebase/firestore'. 'c:/code/project/node_modules/@firebase/firestore/dist/index.node.cjs.js' implicitly has an 'any' type.
  Try `npm install @types/firebase__firestore` if it exists or add a new declaration (.d.ts) file containing `declare module '@firebase/firestore';`ts(7016)

关于 this.auth = app.auth() 和 this.files = app.storage()

Cannot invoke an object which is possibly 'undefined'.ts(2722)

在 this.db = app.firestore() 和 this.firestore = app.firestore 上

Property 'firestore' does not exist on type 'FirebaseNamespace'.ts(2339)

好吧...这是一团糟。我阅读了几个教程,但从现在开始我不明白。你能帮忙吗?

【问题讨论】:

    标签: reactjs typescript firebase google-cloud-firestore firebase-authentication


    【解决方案1】:

    当我为 Firebase 使用 TypeScript 时,我不使用任何以“@”开头的包。一切都可以很好地导入,如documentation 所示。从该页面:

    // Firebase App (the core Firebase SDK) is always required and must be listed first
    import * as firebase from "firebase/app";
    
    // If you enabled Analytics in your project, add the Firebase SDK for Analytics
    import "firebase/analytics";
    
    // Add the Firebase products that you want to use
    import "firebase/auth";
    import "firebase/firestore";
    
    

    【讨论】:

    • 您好,Doug,感谢您的回答。当我输入“yarn”时,这给了我这种类型的错误:错误:在“npm”注册表上找不到“@project/apps@0.0.10”所需的包“firebase/auth@^0.14.9”。
    • “Lerna add”错误也很奇怪:lerna ERR!错误:无效的包名称“firebase/app-types”:名称只能包含 URL 友好字符 lerna ERR!在 invalidPackageName (C:\Users\me\AppData\Roaming\npm\node_modules\lerna\node_modules\npm-package-arg\npa.js:86:15)
    • 我对纱线一无所知。我使用 npm 安装模块。
    • 嗯,我不确定这是问题的根源。到目前为止,我一直在为所有具有作者/模块名称的模块使用@,没有问题。
    • 好吧,这个@我猜你的回答意味着你没有看到一个特定的问题。所以也许这只是奇怪的打字稿错误。一旦我能够启动该应用程序,我就会看到。谢谢。
    【解决方案2】:

    这是新代码,遵循 Doug 回答中的讨论:

    import app from 'firebase/app'
    import 'firebase/firestore'
    import 'firebase/auth'
    import 'firebase/storage'
    
    import firebaseConfig from './config'
    
    export class Firebase {
      app: app.app.App
      auth: app.auth.Auth
      db: app.firestore.Firestore
      firestore: (app?: app.app.App | undefined) => app.firestore.Firestore
      files: app.storage.Storage
    
      constructor() {
        app.initializeApp(firebaseConfig)
        this.app = app.app()
        this.auth = app.auth()
        this.db = app.firestore()
        this.firestore = app.firestore
        this.files = app.storage()
      }
    }
    
    const firebase = new Firebase()
    export default firebase
    

    这次没有错误。

    【讨论】:

    • 根据您的回答我收到此错误Namespace '"c:/Users/username/OneDrive/Documents/React/quick-refactor/likeme/node_modules/firebase/app/dist/app/index"' has no exported member 'app'
    • 你好,第几行?可能有些事情发生了变化。
    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2016-10-21
    • 2019-09-04
    • 2018-05-24
    • 2019-08-14
    • 2021-11-08
    • 2023-04-11
    相关资源
    最近更新 更多