修复 TypeScript monorepo 中错误的自动导入

Rem*_*ing 5 typescript

我有一个 TypeScript mono 存储库,具有以下基本文件布局:

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 packages/\n\xe2\x94\x82\xc2\xa0  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 workspace-a/\n\xe2\x94\x82\xc2\xa0  \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/\n\xe2\x94\x82\xc2\xa0  \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x82\xc2\xa0  \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 workspace-b/\n\xe2\x94\x82\xc2\xa0      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/\n\xe2\x94\x82\xc2\xa0      \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n

tsconfig.json看起来像这样(删除了不相关的属性):

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 packages/\n\xe2\x94\x82\xc2\xa0  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 workspace-a/\n\xe2\x94\x82\xc2\xa0  \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/\n\xe2\x94\x82\xc2\xa0  \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x82\xc2\xa0  \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 workspace-b/\n\xe2\x94\x82\xc2\xa0      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/\n\xe2\x94\x82\xc2\xa0      \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n

tsconfig.json每个包看起来像这样:

\n
{\n  "compilerOptions": {\n    "baseUrl": ".",\n    "paths": {\n      "@scope/*": ["packages/*/src"]\n    },\n    "module": "es2020",\n    "moduleResolution": "node"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

所有包都使用@scope范围。此设置使以下代码可以workspace-a按预期工作:

\n
{\n  "extends": "../../tsconfig"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,以下代码也可以根据tscVSCode 中的自动导入首先工作并建议:

\n
import { Foo } from \'@scope/workspace-b\';\n
Run Code Online (Sandbox Code Playgroud)\n

一旦软件包发布到 npm,后者就不起作用,导致软件包发布后出现问题。

\n

我可以让 TypeScript 禁止后者吗?I\xe2\x80\x99ll 也接受涉及现有 ESLint 规则的解决方案。

\n

完整的源代码可以在这里找到

\n

Rem*_*ing 5

这个问题是由baseUrl选项引起的。以前使用该选项时需要这样做paths

从 TypeScript 4.1 开始,paths无需baseUrl.

所以tsconfig.json看起来像这样:

{
  "compilerOptions": {
    "paths": {
      "@scope/*": ["./packages/*/src"]
    },
    "module": "es2020",
    "moduleResolution": "node"
  }
}
Run Code Online (Sandbox Code Playgroud)

baseUrl尚不支持省略,它也被各种流行的TypeScripttsconfig-paths相关包使用,例如:

请注意,如果您使用tsconfig-pathsfor"paths"来处理ts-node则必须显式指定"baseUrl"它,因为它尚不支持未指定的 baseUrl