没有模块语法的打字稿的Firebase定义

时间:2019-03-04 10:49:39

标签: javascript typescript firebase typescript-typings

如果将firebase包含到HTML中,它将使用firebase变量填充全局名称空间。这可以用于配置Firebase,登录等。例如,标准配置代码段如下所示:

<script src="https://www.gstatic.com/firebasejs/5.8.5/firebase.js"></script>
<script>
  // Initialize Firebase
  var config = {
    // private stuff ...
  };
  firebase.initializeApp(config);
</script>

但是,我正在使用打字稿,却偶然发现了一个奇怪的问题。

我用npm安装了Firebase(它附带了:D)

npm install --save firebase

但是看起来打字稿定义迫使您使用模块语法。可以使用以下代码(根据打字稿编译器):

import firebase from 'firebase'

var config = {//...}
firebase.initializeApp(config);

如果没有import语句,则编译器会警告Firebase不存在。这让我感到惊讶。诚然,如果您从节点使用Firebase,则假定使用模块系统是有意义的。因此,基于模块的定义才有意义。但是,也应该有针对网络版本的定义。

因此,我查看了实际安装的节点软件包。这是我的package.json

{
  "name": "test_sites",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@types/jquery": "^3.3.29",
    "firebase": "^5.8.5",
    "jquery": "^3.3.1"
  }
}

如果将此选项提供给npm install -d,则实际上会安装两个节点模块。一个称为@firebase,另一个称为firebase@firebase定义都是基于模块的,firebase定义看起来像是用于Web客户端代码的。默认情况下会以某种方式发现模块类型定义(how does the typescript compiler discover npm packages with types?),而其他类型则不会。

好吧,所以我编辑了tsconfig.json以包括Firebase定义:

{
    ...
    typeRoots": ["./node_modules/@types", "node_modules/firebase"],
}

现在,打字稿编译器可以愉快地使用我在最顶部包含的代码片段,而无需导入模块。但是tsconfig.json被标记为错误:

Cannot find type definition file for 'dist'

获取客户端Firebase(无模块)类型的正确方法是什么?

0 个答案:

没有答案