打字稿编译器如何发现带有类型的npm软件包?

时间:2019-03-04 10:30:54

标签: typescript npm typescript-definitions

可以通过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中,据我所知,默认情况下不应选择。

1 个答案:

答案 0 :(得分:2)

在TypeScript的发布文档中,您可以看到两种为用户提供类型的方法:https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html

  1. 与您的npm软件包捆绑在一起,或
  2. 在npm上发布到@types组织。

Firebase等较大的库有其自己的类型,请参见 packages/firebase/package.json#L58packages/database/package.json#L68

Typescripts会在正在编译的代码中引用的所有已安装软件包的"typings"中读取那些引用的文件。

typeRoots和常规import 'firebase'之间的区别是:

  1. 在typeRoot中提供类型文件后,这些类型将始终在编译过程中使用(自动包含)。这对于更改全局上下文(如jQuery,node等)的库来说非常有用。它们提供了否则不易获取的全局函数。

  2. 您可以通过说import {Foo} from 'bar'来显式导入它。如果bar程序包的package.json中具有typing属性,则Typescript会将其附加到typeRoots中。

documentation这样说:

  

请记住,仅当您使用带有全局声明的文件(而不是声明为模块的文件)时,自动包含才重要。例如,如果使用import“ foo”语句,TypeScript可能仍会遍历node_modules和node_modules / @ types文件夹来查找foo包。