为 monorepo 扩展“路径”tsconfig 文件

Sep*_*eed 8 typescript tsconfig monorepo

我有一个像这样的文件夹结构:

- mono-repo
  tsconfig.paths.json
  - Website
   tsconfig.json
   - src
     test.ts
     index.ts
  - Tool
   - src
    index.ts
Run Code Online (Sandbox Code Playgroud)
- mono-repo
  tsconfig.paths.json
  - Website
   tsconfig.json
   - src
     test.ts
     index.ts
  - Tool
   - src
    index.ts
Run Code Online (Sandbox Code Playgroud)
// mono-repo/Website/src/index.ts
import { test } from "test";
import { tool } from "tool";

test(tool);
Run Code Online (Sandbox Code Playgroud)

我希望能够进行扩展,tsconfig.paths.json以便每个包都为其他包正确输入模块导入。


失败的尝试 1

// mono-repo/tsconfig.paths.json
{
  "compilerOptions": {
    "paths": {
      "tool": ["Tool/src"],
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

问题:找不到模块“工具”。添加到路径的 baseUrl 指向mono-repo/Website/src/Tool/src. 这不是一条真正的道路。


失败的尝试 2

// mono-repo/Website/src/index.ts
import { test } from "test";
import { tool } from "tool";

test(tool);
Run Code Online (Sandbox Code Playgroud)

问题:无法从“测试”导入测试。baseUrl 不是项目 src。除了相对路径之外的任何东西都将无法导出。


实用但丑陋的尝试 3

// mono-repo/Website/tsconfig.json
{
  "extends": "../tsconfig.paths.json",
  "compilerOptions": {
    "baseUrl": "./src",
  }
}
Run Code Online (Sandbox Code Playgroud)
// mono-repo/Website/tsconfig.json
{
  "extends": "../tsconfig.paths.json",
  "compilerOptions": {
    "baseUrl": "../",
  }
}
Run Code Online (Sandbox Code Playgroud)

问题:有效,但假设扩展 tsconfig.paths.json 的每个 tsconfig 的 baseUrl 将始终是下面的两个目录mono-repo。这对于我的项目目前是正确的,但我犹豫是否将其作为标准。


如何为 monorepo 设置可扩展的“路径”tsconfig json?

Adr*_*tti 12

需要知道的是 tsconfig extends 是一个overrideand not a merge。有了这些信息,您就可以了解到您试图通过扩展基本 tsconfig 来实现的目标无法按您期望的方式工作。

此外,使用这些paths选项应始终与 成对使用,baseUrl以解决分辨率问题。

尽管如此,这里有一个可以用来解决该问题的解决方案。

在项目的根级别创建一个 tsconfig.json,如下所示:

"paths": {
  "~/*": ["../../../mono-repo/*/src"]
}
Run Code Online (Sandbox Code Playgroud)

这意味着在每个子包中,您可以扩展该tsconfig文件,然后将您的src目录指定为baseUrl. 然后您将可以按如下方式导入:

import { tool } from "~/Tool";
Run Code Online (Sandbox Code Playgroud)

希望很清楚,如果有什么遗漏请告诉我=)