如何制作一个使用全局类型但不使用它来扩展项目的 NPM 包?

2024-02-16

问题:

任何在许多不同文件中重用大量类型的项目都可以使用在脚本文件。这些类型在整个项目中全局可见,不需要导入,请参阅官方手册 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
  }
}

如果依赖项需要某些类型,我觉得消费者也应该获得这些类型,因此实现这一点可能并不容易。

您可以尝试在单独的库中定义全局类型(请参阅您的上一个问题 https://stackoverflow.com/questions/55659710/how-to-make-an-npm-module-with-globally-accessible-types/55686174?noredirect=1#comment98106890_55686174了解如何做到这一点;这次图书馆可以像这样简单my-global-library/index.d.ts,除非您需要从兄弟依赖项中导入类型 - 在这种情况下您可以考虑将它们分离到它们自己的共享库中),然后将该库安装为devDependency你的 NPM 包。任何使用您的 NPM 包的项目都不会安装devDependency.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何制作一个使用全局类型但不使用它来扩展项目的 NPM 包? 的相关文章

随机推荐