问题:
任何在许多不同文件中重用大量类型的项目都可以使用在脚本文件。这些类型在整个项目中全局可见,不需要导入,请参阅官方手册 https://www.typescriptlang.org/docs/handbook/modules.html:
在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含顶级import
or export
被视为一个模块。相反,没有任何顶层的文件import
or export
声明被视为一个脚本,其内容在全局范围内可用(因此也适用于模块)。
我在我的项目中使用了这些全局类型,并且它们工作得很好。但后来我决定将项目变成 NPM 模块。该模块的“全局”类型应该仅对模块本身可见。
首先,我按原样发布模块,不添加任何内容<reference/>
s and 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
and foo.ts
仅包含常规代码 - 这导致项目在运行时无法识别类型。当我第二次发布该模块时,我添加了///<reference path="types.ts"/>
二者皆是index.ts
and foo.ts
。这被翻译成path="types.d.ts"
在编译后的文件中index.d.ts
and 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
}
}