为什么 Typescript 项目引用使用父 tsconfig 文件而不是引用自己的 tsconfig 文件?

问题描述

我有两个项目:applibapp 取决于 lib

app一个严格的 Typescript 项目,lib 不工作与严格。

我使用 Typescript 项目参考将它们连接在一起:

./tsconfig.json

  "compilerOptions": {
    "strict": true,},"references": [
    { "path": "./apps/app" },{ "path": "./libs/lib/" }
  ]

./apps/app/tsconfig.json

  "extends": "../../tsconfig.json","references": [
    {
      "path": "../../libs/lib/tsconfig.json"
    }
  ]

./libs/lib/tsconfig.json

  "extends": "../../tsconfig.json","compilerOptions": {
    "composite": true,"strict": false
  },

但是当我运行 app 时我会失败,因为 lib 代码正在运行,就好像严格为真一样:

TSError: ⨯ Unable to compile TypeScript:
../../libs/lib/src/index.ts:4:3 - error TS2564: Property 'uninitializedProperty' has no initializer and is not definitely assigned in the constructor.

但是 lib 将严格指定为假!如果严格被禁用,它工作正常。如何配置 Typescript 使项目实际上是独立的,并且每个项目中的代码都使用自己的 tsconfig 选项?

在这里准备了一个示例存储库:https://github.com/gaggle/monorepo-tsconfig-experiment。欢迎提出任何想法和建议!


只是为我的问题提供一些上下文:我想将多个项目移动到单个 monorepo,但并非所有代码都可以使用相同的编译器选项。 “严格”差异就是一个例子,我不能只修复代码,使其都使用相同的选项。

解决方法

我让你的示例存储库很容易构建——我唯一遇到的问题是它不完整,这告诉我你实际上并没有尝试构建它。 Project.json 缺少依赖项。

但更重要的是,我可以看出您没有花太多时间阅读 Project References 的工作原理,也没有阅读太多 project references 页面。所以我犹豫是否只为你做你的工作并给你最终的答案。相反,我会给你一个你不理解的东西的清单,提示你做错了什么。

这些是您弄错的 tsconfig 设置:

  • composite
  • rootDir
  • include
  • files

您的三个 tsconfig 中的每一个都至少有一个错误。

修复这些问题,tsc -b .tsc -b apps/apptsc -b libs/lib 都会按预期工作。

如果您取得了进展,但仍然感到困惑或卡住,那么我会提供帮助。更新示例存储库和您的问题,并表明您已尝试过。