首页 > 解决方案 > 为什么 Typescript 项目引用使用父 tsconfig 文件而不是引用自己的 tsconfig 文件?

问题描述

我有两个项目:applib. app取决于lib

app是一个严格的 Typescript 项目,lib 不适用于 strict。

我使用 Typescript Project References 将它们连接在一起:

./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,但并非所有代码都可以使用相同的编译器选项。“严格”的区别就是一个例子,我不能只修复代码,所以它们都可以使用相同的选项。

标签: typescripttsconfigmonorepostrict

解决方案


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

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

这些是tsconfig您弄错的设置:

  • composite
  • rootDir
  • include
  • files

tsconfig你的三个s中的每一个都至少有一个问题。

修复这些 和tsc -b .tsc -b apps/app并且tsc -b libs/lib将按预期工作。

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


推荐阅读