我有一个仅带Typescript软件包的Monorepo。当我运行tsc --build
时,所有软件包都将编译为Javascript。直到我添加了一个包含Angular应用程序的程序包为止,这种方法都很好。
为了测试我的包裹,我使用了Jest。但是Angular使用Jasmine。
现在运行tsc --build
时,Jasmine和Jest的类型似乎冲突。
我总共收到184个错误。来自node_modules/@types/jest
和node_modules/@types/jasmine
以及我自己的软件包:
我只显示了错误日志中的一些摘要,因为粘贴整个内容太长了。您可以在此处找到完整的错误日志:https://gist.github.com/flolude/115e92ca13cd8c86a4dca03528b92d4f
笑话 node_modules/@types/jest/index.d.ts:1310:9-错误TS2717:后续属性声明必须具有相同的类型。属性“ message”必须为“ string”类型,但此处的类型为“ string | (()=>字符串)'。
1310 message: string | (() => string);
~~~~~~~
茉莉花
node_modules/@types/jasmine/ts3.1/index.d.ts:304:9
304 message?: string;
~~~~~~~
'message' was also declared here.
我自己的包裹
services/gateway/src/gateway.server.ts:7:24 - error TS2307: Cannot find module '@cents-ideas/utils'.
7 import { Logger } from '@cents-ideas/utils';
~~~~~~~~~~~~~~~~~~~~
当我从Angular项目的package.json中删除Jasmine类型时,所有内容都能正确编译。这就是为什么我确定它们导致了错误。但是我需要那些软件包才能用Angular进行测试。
"devDependencies": {
// no errors when I remove those 2 packages
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3",
// ...
}
正如我已经提到的,我在Monorepo内部进行操作。如果您需要进一步的了解,这是源代码:
答案 0 :(得分:1)
我也遇到了这个问题,我可以想到三种可能的方法:
由于您似乎正在开始一个新的Angular项目,并且实际上尚未编写任何基于Jasmine的Angular测试,因此您最好也将Jest用于该项目。如果Angular项目中已经有Jasmine测试,那么迁移也很容易。
这将防止检查库类型文件的类型。但是,现在可能无法检测到某些错误,并且可能会在运行时(TypeScript Manual)击中您
使用tsconfig typeRoot compilerOptions,您可以在相应的.d.ts声明中专门提取并修复冲突。
您需要的是以某种方式“打破”两个声明之间的联系。因此,请考虑创建一个新文件夹:“ overrides”,然后将“ overrides \ jest \ index.d.ts”添加为您认为应该的样子。然后更新您的tsconfig.json以包括“ typeRoots”:[“。\ overrides,”。\ node_modules @ types“]。这会告诉编译器首先在“。\ overrides \ jest”中查找类型,如果找不到,则在“。\ node_modules @ types \ jest”`中查找类型。 GitHub Source
但是,您现在必须维护基本上是类型定义文件的本地派生类。如果可以的话,应该将该修复程序上游发布到您认为应该修复的任何库中。