如何在没有冲突的情况下将 Mocha 和 Jest 与 TypeScript 一起使用?

Posted

技术标签:

【中文标题】如何在没有冲突的情况下将 Mocha 和 Jest 与 TypeScript 一起使用?【英文标题】:How to use Mocha and Jest with TypeScript without conflicts? 【发布时间】:2019-10-04 12:19:43 【问题描述】:

我正在尝试在一个项目中安装 Mocha 和 Jest 类型。我们使用严格的类型检查,所以我得到与冲突的全局类型相关的错误。

我尝试创建模棱两可的模块声明,在 types tsconfig 中仅定义 Mocha。我一直在尝试删除 Jest 的声明——但这会有所帮助。禁用严格类型检查或库检查不是一个选项。

我希望它能够正常工作,但却出现了下一个错误。

node_modules/@types/jest/index.d.ts(29,13): error TS2403: Subsequent variable declarations must have the same type.  Variable 'beforeEach' must be of type 'HookFunction', but here has type 'Lifecycle'.
node_modules/@types/jest/index.d.ts(31,13): error TS2403: Subsequent variable declarations must have the same type.  Variable 'afterEach' must be of type 'HookFunction', but here has type 'Lifecycle'.
node_modules/@types/jest/index.d.ts(32,13): error TS2403: Subsequent variable declarations must have the same type.  Variable 'describe' must be of type 'SuiteFunction', but here has type 'Describe'.
node_modules/@types/jest/index.d.ts(34,13): error TS2403: Subsequent variable declarations must have the same type.  Variable 'xdescribe' must be of type 'PendingSuiteFunction', but here has type 'Describe'.
node_modules/@types/jest/index.d.ts(35,13): error TS2403: Subsequent variable declarations must have the same type.  Variable 'it' must be of type 'TestFunction', but here has type 'It'.
node_modules/@types/jest/index.d.ts(37,13): error TS2403: Subsequent variable declarations must have the same type.  Variable 'xit' must be of type 'PendingTestFunction', but here has type 'It'.
node_modules/@types/jest/index.d.ts(38,13): error TS2403: Subsequent variable declarations must have the same type.  Variable 'test' must be of type 'TestFunction', but here has type 'It'.
node_modules/@types/node/globals.d.ts(926,15): error TS2430: Interface 'Global' incorrectly extends interface 'MochaGlobals'.
  Types of property 'describe' are incompatible.
    Type 'Describe' is not assignable to type 'SuiteFunction'.
      Types of property 'only' are incompatible.
        Type 'DescribeBase' is not assignable to type 'ExclusiveSuiteFunction'.
          Type 'void' is not assignable to type 'Suite'.

即使从 Jest 中删除所有类型也会给我这个错误:

node_modules/@types/node/globals.d.ts(926,15): error TS2430: Interface 'Global' incorrectly extends interface 'MochaGlobals'.
  Types of property 'describe' are incompatible.
    Type 'Describe' is not assignable to type 'SuiteFunction'.
      Types of property 'only' are incompatible.
        Type 'DescribeBase' is not assignable to type 'ExclusiveSuiteFunction'.
          Type 'void' is not assignable to type 'Suite'.

【问题讨论】:

你有想过这个吗? 不幸的是,没有。好难过 【参考方案1】:

截至 2019 年 8 月,这似乎已在 master 上得到修复,但尚未发布新版本。

与此同时,我能够通过将以下内容添加到我的定义之一来解决这些错误:

declare module '@jest/types/build/Global' 
  interface DescribeBase extends mocha.SuiteFunction 
  interface ItBase extends mocha.TestFunction 

【讨论】:

您好奥列格,感谢您的回答。我们面临着同样的问题。我应该在哪里/向哪个文件添加此语句?我不明白您所说的“我的定义之一”是什么意思。谢谢。 @MattG 您应该可以将其放入任何文件中,例如您的测试设置文件或类型定义文件之一。 不幸的是,这对我不起作用。仍然看到同样的错误。【参考方案2】:

我搜索了包锁定文件以查看哪些依赖项使用@types/jest,并发现在我的项目中我仍然有ts-jest,我将其删除并且冲突消失了

【讨论】:

以上是关于如何在没有冲突的情况下将 Mocha 和 Jest 与 TypeScript 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Vue 单元测试 使用mocha+jest

web前端好帮手 - Jest单元测试工具

如何解决 Testcafe 和 Jest 之间的类型冲突? (“无法重新声明块范围变量'test'”)

如何在没有 usermod 的情况下将用户添加到组?

如何在没有循环的情况下将文件逐行读入变量

如何在没有“行”和“列”标题的情况下将 flexdashboard 呈现为 PDF