上下文
我正在使用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" />