问题:
任何在许多不同文件中重用大量类型的项目都可以使用脚本文件中定义的类型。这些类型在整个项目中全局可见,不需要导入,参见官方手册:
在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含顶级文件的文件
import
都export
被视为模块。相反,没有任何顶级import
或export
声明的文件被视为其内容在全局范围内可用的脚本(因此也可用于模块)。
我在我的项目中使用了这些全局类型并且它们运行良好。但后来我决定把这个项目变成一个 NPM 模块。该模块的“全局”类型应该只对模块本身可见。
首先,我按原样发布了模块,没有添加任何<reference/>
s 和typeRoots
. 但是,当将模块导入另一个项目时,TypeScript 找不到全局类型并且无法编译。
然后我添加<reference path="types.ts" />
到模块中使用全局类型的所有文件中,然后我再次推送。令我惊讶的是,这使得类型不仅对模块可用,而且对使用它的整个项目都可用,从而导致本地类型和模块类型之间发生冲突。
(请注意,我发布的模块的两个版本都可以自行完美编译,当我npm i
在不同的项目中安装模块时,问题就开始了。)
有没有办法让模块的“全局”类型只在模块中可用?
我的模块结构:
.
├── dist
│ ├── index.d.ts
│ ├── index.js
│ ├── foo.d.ts
│ ├── foo.js
│ ├── types.d.ts
│ └── types.js
├── package.json
├── src
│ ├── index.ts ← contains import/export
│ ├── foo.ts ← contains import/export
│ └── types.ts ← contains only types, no import/export
└── tsconfig.json
对于第一次发布,index.ts
并且foo.ts
只包含常规代码 - 这导致项目在项目时无法识别类型。当我第二次发布该模块时,我同时添加///<reference path="types.ts"/>
了index.ts
和foo.ts
. 这被翻译成path="types.d.ts"
编译文件index.d.ts
和foo.d.ts
.
包.json:
{
"name": "@foo/foo",
"version": "1.0.0",
"main": "dist/index.js"
}
tsconfig.json:
{
"include": ["./src"],
"compilerOptions": {
"moduleResolution": "classic",
"outDir": "./dist",
"module": "commonjs",
"declaration": true
}
}