首页 > 解决方案 > typescript 编译器如何发现带有类型的 npm 包?

问题描述

typescript 编译器可以通过tsconfig.json. 这还提供了用于使用密钥发现类型定义文件的设置。typeRoots

默认:

默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的 node_modules/@types 中的包都被认为是可见的;具体来说,这意味着 ./node_modules/@types/、../node_modules/@types/、../../node_modules/@types/ 等中的包。

如果指定了 typeRoots,则只包含 typeRoots 下的包

许多包在单独的@types/<package-name>包中提供它们的类型定义。以jQuery为例。同时,有些包附带了捆绑的类型定义,Firebase就是这样做的。

为什么打字稿编译器可以在不编辑设置的情况下选择 Firebase 定义typeRoots?这些定义不在@types 中,据我所知,默认情况下不应选择。

标签: typescriptnpmtypescript-definitions

解决方案


在 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 中额外拾取它。

文档是这样说的:

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


推荐阅读