【问题标题】:Why is a Typescript project reference using the parent tsconfig file instead of the reference's own tsconfig file?为什么 Typescript 项目引用使用父 tsconfig 文件而不是引用自己的 tsconfig 文件?
【发布时间】:2021-09-10 07:31:45
【问题描述】:

我有两个项目: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 指定 strict 为 false!如果严格被禁用,它工作正常。如何配置 Typescript,使项目实际上是独立的,并且每个项目中的代码都使用自己的 tsconfig 选项?

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


只是为我的问题提供一些背景信息:我想将多个项目移动到一个 monorepo,但并非所有代码都可以使用相同的编译器选项。 “严格”的区别就是一个例子,我不能只修复代码,所以它们都可以使用相同的选项。

【问题讨论】:

  • 我不认为ts-node 使用--build 构建项目,但需要后者来激活项目引用构建。 github.com/TypeStrong/ts-node/issues/897
  • 令人着迷。谢谢你。如果没有 ts-node,我将如何使其工作?我可以在应用程序中运行tsc -b 并看到它构建了lib,我不知道它会起作用,所以我已经在学习了。但是输出仍然无法运行,我收到SyntaxError: Unexpected token 'export' 之类的错误,所以我什至不知道如何在 ts-node 之外运行。
  • "main": "src/index.ts", 需要指向dist 版本。 “main”是 NodeJS 在导入 lib 时尝试加载的内容。在您的情况下,TypeScript 链接在“main”中,但 NodeJS 无法读取 TypeScript 源代码。 TypeScript 构建为 commonjs(根据您的设置)并将其结果放入 dist 文件夹。使用"main": "dist/index.js",它应该可以工作。
  • 我不知道为什么,但libs/lib 的 dist 文件夹以 src 文件夹结束,所以我将其 package.json 字段设置为 "main": "dist/src/index.js"。我仍然遇到错误,但是当我什至无法解释为什么 src 文件夹位于 libs/lib 而不是应用程序/应用程序的 dist 时,我觉得我可能遗漏了一些非常基本的概念。但是感谢您的提示,我已将示例存储库更改为将 main 指向 JS。

标签: typescript tsconfig monorepo strict


【解决方案1】:

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

但更重要的是,我可以看出您没有花太多时间阅读项目参考的工作原理,也没有阅读很多 project references 页面。所以我犹豫是否只是为你做你的工作并给你最终的答案。相反,我会给你列出你不理解的地方,提示你做错了什么。

这些是您弄错的tsconfig 设置:

  • composite
  • rootDir
  • include
  • files

您的三个tsconfigs 中的每一个都至少有一个问题。

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

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

【讨论】:

  • 谢谢!我读过项目参考,但我确实觉得它令人困惑:在composite,文档说Referenced projects must have composite enabled,我读到这只是指libs/lib(因为apps/app 引用它)。文档说rootDir defaults to directory containing the tsconfig file 所以我把它省略了。我尝试了各种includes 都没有成功(例如src/**/*),但我很高兴知道我做错了什么。 AFAIK 当我使用include 时,我不需要files。因此,尽管您提供了线索,但我仍然感到困惑……也许我已经把自己逼入了一个愚蠢的角落,但我真的很感谢您抽出宝贵的时间!
  • 只是为了避免通信错误:我现在添加了几个小提交,并根据您的回复进行了更改,但这几乎只是使用我看到的文档推荐的 src/**/* 包含模式以及能够从根目录运行tsc -b
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2019-05-01
  • 2023-01-20
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
相关资源
最近更新 更多