TypeScript tsc 类型检查与 monorepos 中的引用

问题描述 投票:0回答:2

我正在使用 Yarn Workspaces,我想要一个 cli 命令来检查位于

packages/*
的源 ts 文件的类型。

最初,我使用 webpack(使用 esbuild,它不检查类型)构建我的项目,并使用

tsc --noEmit
独立检查类型。而且他们合作得很好。

切换到 Yarn Workspaces 后,我将整个项目分成几个小包。

整个项目是这样的:

packages/
  foo/
    index.ts          // import bar from 'bar'; console.log(bar);
    package.json      // { "name": "foo" }
    tsconfig.json     // { "references": [ { "path": "../bar" } ] }
  bar/
    index.ts          // export default "hello world";
    package.json      // { "name": "bar" }
    tsconfig.json     // { "compilerOptions": { "composite": true } }
package.json          // { "workspaces": [ "packages/*" ] }

然后我发现

tsc
无法运行。当我尝试
tsc --noEmit -p packages/foobar
时,它失败并出现一堆错误,例如:

Output file '/packages/foobar/index.d.ts' has not been built from source file '/packages/foobar/index.ts'.

但是 webpack 工作得很好。

上网查了一下,官方文档告诉我这两个功能只能在build模式下使用。但是当我尝试

tsc --noEmit -b packages/foobar
时,由于
--noEmit
标志和构建模式之间的冲突,它也失败了。此外,如果我删除了
--noEmit
标志,
tsc
将尝试为我生成一堆
.js
文件,但我不希望生成它们。

我只想要一个 cli 命令来检查类型,而不像我的 IDE 那样输出任何额外的文件。如何正确运行

tsc
?或者有什么替代方案吗?

typescript tsc monorepo
2个回答
0
投票

尝试将

typescript
作为依赖项添加到要检查的包的
package.json
中。

(编辑):看起来也不像

tsc --noemit
适用于项目引用...


0
投票

刚刚遇到了同样的问题,并通过使用 TS 项目参考“解决”了,我在我的

tsconfig.json

中添加了以下内容
"compilerOptions": {
  ...
  "emitDeclarationOnly": true,
  ...
}

这告诉 Typescript 编译器不要将任何 TS 转译为 JS,而只发出

.d.ts
声明文件。

然后在我的

package.json

scripts: {
   "lint": "tsc -b"
}
"

这将构建任何 TS 项目引用以及您正在其中运行 tsc 的项目。尽管由于我们打开了“emitDeclarationOnly”,所以它只会为此项目构建声明文件。

© www.soinside.com 2019 - 2024. All rights reserved.