可以通过tsconfig.json
来配置打字稿编译器。这也为settings for discovering type definition files提供了typeRoots
键。
默认情况下:
默认情况下,所有可见的“ @types”软件包都包含在您的 汇编。任何封闭文件夹的node_modules / @ types中的软件包 被认为是可见的;具体来说,这意味着 ./node_modules/@types/,../node_modules/@types/, ../../node_modules/@types/,依此类推。
如果指定了typeRoots,则只有typeRoots下的软件包是 包含
许多软件包在单独的@types/<package-name>
软件包中提供其类型定义。例如Jquery。
同时,有些软件包附带捆绑的类型定义,Firebase会这样做。
为什么打字稿编译器可以在不编辑typeRoots
设置的情况下选择Firebase定义?这些定义不在@types中,据我所知,默认情况下不应选择。
答案 0 :(得分:2)
在TypeScript的发布文档中,您可以看到两种为用户提供类型的方法:https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html
Firebase等较大的库有其自己的类型,请参见 packages/firebase/package.json#L58或packages/database/package.json#L68。
Typescripts会在正在编译的代码中引用的所有已安装软件包的"typings"
中读取那些引用的文件。
typeRoots
和常规import 'firebase'
之间的区别是:
在typeRoot中提供类型文件后,这些类型将始终在编译过程中使用(自动包含)。这对于更改全局上下文(如jQuery,node等)的库来说非常有用。它们提供了否则不易获取的全局函数。
您可以通过说import {Foo} from 'bar'
来显式导入它。如果bar
程序包的package.json中具有typing
属性,则Typescript会将其附加到typeRoots中。
documentation这样说:
请记住,仅当您使用带有全局声明的文件(而不是声明为模块的文件)时,自动包含才重要。例如,如果使用import“ foo”语句,TypeScript可能仍会遍历node_modules和node_modules / @ types文件夹来查找foo包。