全局Typescript声明在node_modules/@types之外不可见



上下文

我正在使用Typescript开发一个npm包,因此类型与库一起发货,基本上是:

my-package
|- index.js
|- index.d.ts
|- package.json

index.d.ts文件包含全局变量,类似于:

declare var thisIsAGlobal: string

问题

发布包并使用npm i my-package安装在另一个项目中后,除非在项目中的任何文件中显式显示import 'my-package'/// <reference types="my=package" />,否则typescript不会看到全局变量,此后全局变量可见。

项目:

- node_modules
|- my-library
|- index.d.ts
- src
|- index.ts  // thisIsAGlobal global not visible
|- other_file.ts // thisIsAGlobal global not visible

发现

在尝试对Jest类型进行逆向工程时,我发现我的全局和Jest全局之间的唯一区别是位置,Jest全局在node_modules/@types/jest/index.d.ts中,而我的在node_modules/@types之外,一开始我认为这与package.json或某些类型配置有关,但我做了以下实验:

我在node_modules/@types中的一个文件夹中手动创建了一个文件(其中有一个全局文件(,全局文件在我的项目文件中可见。

- node_modules
|- @types
|- experiment
|- index.d.ts  // declare var thisIsAGlobal: number

如果我把实验文件放在@types目录之外,全局文件在项目文件中就不可见了。

- node_modules
|- @types
|- experiment
|- index.d.ts  // declare var thisIsAGlobal: number

您甚至不需要@types目录中的package.json文件,typescript就可以获得全局类型。

问题

发布具有全局类型的包时,是否缺少某些内容?

也许对于@types之外的类型,您需要特殊配置?

默认情况下,始终扫描node_modules/@types

默认情况下,所有可见的"@types"包都包含在编译中。任何封闭文件夹的node_modules/@类型中的包都被认为是可见的。——https://www.typescriptlang.org/tsconfig#types

您可以看到@types被无条件地拉入(给定默认的tsconfig.json(tsc --traceResolution

事实证明,正如您所发现的,只有当您真正从给定的包中导入某些内容时,才会扫描node_modules包。我找不到任何理由或讨论默认扫描所有node_modules而不是,但不只是默认扫描node_modules中的每个包的类型似乎很合理。这可能需要大量的扫描。此外,这些包中的任何类型(全局或其他类型(只有在您真正从中导入某些内容时才是相关的(如果从未导入包,则包不会改变全局状态(。相反,默认情况下扫描@types似乎是合理的,这样就可以收集一些全局类型,比如隐式使用但不导入的node(@types/node(。最后一个论点是,默认情况下从node_modules导入所有类型会增加冲突的概率。

文档确实说,如果你想从";全球图书馆";并且没有从中导入任何您应该使用的内容:

/// <reference types="someLib" />

相关内容

  • 没有找到相关文章

最新更新