我正在使用 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
作为依赖项添加到要检查的包的 package.json
中。
(编辑):看起来也不像
tsc --noemit
适用于项目引用...
刚刚遇到了同样的问题,并通过使用 TS 项目参考“解决”了,我在我的
tsconfig.json
中添加了以下内容
"compilerOptions": {
...
"emitDeclarationOnly": true,
...
}
这告诉 Typescript 编译器不要将任何 TS 转译为 JS,而只发出
.d.ts
声明文件。
然后在我的
package.json
:
scripts: {
"lint": "tsc -b"
}
"
这将构建任何 TS 项目引用以及您正在其中运行 tsc 的项目。尽管由于我们打开了“emitDeclarationOnly”,所以它只会为此项目构建声明文件。