在Monorepo中添加角度时,Typescript构建失败(茉莉花和Jest类型的冲突)

时间:2019-09-22 16:57:14

标签: angular typescript jasmine jestjs monorepo

要旨

我有一个仅带Typescript软件包的Monorepo。当我运行tsc --build时,所有软件包都将编译为Javascript。直到我添加了一个包含Angular应用程序的程序包为止,这种方法都很好。

为了测试我的包裹,我使用了Jest。但是Angular使用Jasmine。

问题

现在运行tsc --build时,Jasmine和Jest的类型似乎冲突。

我总共收到184个错误。来自node_modules/@types/jestnode_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内部进行操作。如果您需要进一步的了解,这是源代码:

1 个答案:

答案 0 :(得分:1)

我也遇到了这个问题,我可以想到三种可能的方法:

  1. 在您的Angular项目中不要使用Jasmine。
  2. 使用-skipLibCheck tsc标志
  3. 使用typeRoots

不要在您的Angular Project中使用Jasmine。

由于您似乎正在开始一个新的Angular项目,并且实际上尚未编写任何基于Jasmine的Angular测试,因此您最好也将Jest用于该项目。如果Angular项目中已经有Jasmine测试,那么迁移也很容易。

使用-skipLibCheck tsc标志

这将防止检查库类型文件的类型。但是,现在可能无法检测到某些错误,并且可能会在运行时(TypeScript Manual)击中您

使用TypeRoots

使用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

但是,您现在必须维护基本上是类型定义文件的本地派生类。如果可以的话,应该将该修复程序上游发布到您认为应该修复的任何库中。