在 monorepo 中如何使用 tsconfig.json“types”字段?

Jam*_*mes 5 typescript tsconfig monorepo yarnpkg

第 1 部分 - 使用“类型”字段的示例

TypeScript 库 A除了“正常”导出之外还提供类型定义,如下所示:

declare global {
  function someGlobalFunction(): void;
}
Run Code Online (Sandbox Code Playgroud)

库 B 使用库 A 的类型定义。因此,在库 B 的 tsconfig.json 中,我们输入:

"types": ["library-a"],
Run Code Online (Sandbox Code Playgroud)
  • 通过这样做,使用someGlobalFunction不再导致编译器错误。
  • 显然,这需要将“library-a”列为库 B 的 package.json 中的依赖项。
  • 显然,它还要求“library-a”已安装并在“node_modules”子目录中可用。

第 2 部分 - Monorepo

我有一个 TypeScript monorepo。(它使用 NX 作为 monorepo 工具,使用 Yarn 作为包管理器,但这可能并不重要,因为这个问题适用于任何类型的 TypeScript monorepo。)

如果库 A 和库 B 都在我的 monorepo 中,我如何复制第 1 部分中的设置?

首先,monorepo 使用pathstsconfig.json 文件中的字段,以便包可以相互导入,而无需实际安装它们。这很简单,而且效果很好。然而,如果我们使用该字段,它就会崩溃types,因为pathstypes似乎没有被编程为一起工作。具体来说:

  • 如果我尝试"types": ["library-a"]像以前一样指定,TypeScript 找不到它,说library-a找不到。
  • 如果我尝试添加一个typeRoots字段来指向正确的“dist”目录,那么我可以克服该错误,但对于所有单个符号仍然会出现一堆“未找到”错误。
  • 如果我library-a直接安装,那么一切都会正常,但这样做首先就违背了使用 monorepo 的全部意义。

包从 monorepo 中的另一个包导入类型的正确方法是什么?

如果需要,我可以提供一个最小的 reprex 存储库来说明问题。

Max*_*rok 2

我成功地使用以下方法达到了您想要的library-b结果tsconfig.json

{
  "compilerOptions": {
    "types": ["../library-a"],
    "typeRoots": ["../library-a/types"],
    "paths": {
      "library-a": ["../library-a/index.ts"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/Maxim-Mazurok/ts-2libs以获取完整复制。

如果我弄错了 - 请分叉它或提供您自己的重现。