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

时间:2020-09-04 08:23:02

标签: typescript

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

├── packages/
│   ├── workspace-a/
│   │   ├── src/
│   │   └── tsconfig.json
│   └── workspace-b/
│       ├── src/
│       └── tsconfig.json
└── tsconfig.json

tsconfig.json如下所示(去除了不相关的属性):

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@scope/*": ["packages/*/src"]
    },
    "module": "es2020",
    "moduleResolution": "node"
  }
}
每个程序包的

tsconfig.json如下:

{
  "extends": "../../tsconfig"
}

所有软件包都使用@scope范围。此设置可以使workspace-a的以下代码正常工作:

import { Foo } from '@scope/workspace-b';

但是,以下代码也可以根据tsc起作用,并且首先由VSCode中的自动导入建议:

import { Foo } from '@scope/workspace-b/src';
import { Bar } from 'packages/workspace-b/src';

将软件包发布到npm后,后者不起作用,从而导致在发布软件包后 出现问题。

我可以使TypeScript禁止后者吗?我也会接受涉及现有ESLint规则的解决方案。

完整的源代码可以在here中找到。

1 个答案:

答案 0 :(得分:0)

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

从 TypeScript 4.1 paths can be used without baseUrl 开始。

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

{
  "compilerOptions": {
    "paths": {
      "@scope/*": ["./packages/*/src"]
    },
    "module": "es2020",
    "moduleResolution": "node"
  }
}

省略 baseUrltsconfig-pathsnot yet supported,它也被各种流行的 TypeScript 相关包使用,例如: