2

问题:

任何在许多不同文件中重用大量类型的项目都可以使用脚本文件中定义的类型。这些类型在整个项目中全局可见,不需要导入,参见官方手册

在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含顶级文件的文件importexport被视为模块。相反,没有任何顶级importexport声明的文件被视为其内容在全局范围内可用的脚本(因此也可用于模块)。

我在我的项目中使用了这些全局类型并且它们运行良好。但后来我决定把这个项目变成一个 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.tsfoo.ts. 这被翻译成path="types.d.ts"编译文件index.d.tsfoo.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
  }
}
4

1 回答 1

1

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

您可以尝试在单独的库中定义全局类型(有关方法,请参阅您之前的问题;这次库可能很简单my-global-library/index.d.ts,除非您需要从同级依赖项中导入类型 - 在这种情况下,您可以考虑旋转将它们放入自己的共享库中),然后将该库安装为devDependencyNPM 包的一个。任何使用你的 NPM 包的项目都不会安装devDependency.

于 2019-04-17T09:13:35.513 回答