【问题标题】:VSCode does not recognize jest custom matcherVSCode 无法识别开玩笑的自定义匹配器
【发布时间】:2021-09-29 22:35:16
【问题描述】:

我目前正在努力使 Jest 自定义匹配器在 VSCode 中使用 typescript 工作。

我编写了一个自定义匹配器文件,如下所示(为简洁起见,我简化了测试):

export {}

declare global {
  namespace jest {
    interface Matchers<R, T = {}> {
      toSucceed(): R
    }
  }
}

function toSucceed(this: jest.MatcherContext, received: Result<any>): any {
  return {
    pass: true,
    message: () => 'Custom matcher message',
  }
}

expect.extend({
  toSucceed,
})

我在jest.config.ts 的标签setupFilesAfterEnv 下包含了这个文件路径。

然后我写了这样的测试:

it('should pass', () => {
  expect(foo()).toSucced()
})

所有这些配置都可以正常工作,但我仍然收到 VSCode 内联错误: Property 'toSucceed' does not exist on type 'JestMatchers&lt;any&gt;'

JestMatchers 是 @types/jest 根内的类型定义,因为它是我无法直接扩充的类型。

有没有人遇到过类似的问题?

【问题讨论】:

    标签: jestjs ts-jest


    【解决方案1】:

    当“接口匹配器”的命名空间声明不正确时,我遇到了类似的错误消息。修复该问题后,jestMatchers 中也出现了一个自定义匹配器。 Matchers 和 jestMatchers 是相连的。

    你的代码对我来说很好——除了未定义的Result&lt;any&gt;——所以你可以尝试直接在测试中导入,看看Visual Studio Code是否能理解声明:

    import "./toSucceed";
    

    如果直接导入对您有用,我猜想帮助 Visual Studio Code 理解 jest.config 的 jest 扩展存在问题。

    【讨论】:

    • 使用 ``` import "./toSucceed" `` 来移除 VSCode 错误。但我仍然无法让 VSCode 自动检测类型。
    【解决方案2】:

    您是否记得将类型定义添加到您的 tsconfig 中?

    对我来说,当我将类型定义放在根级别的 d.ts 文件中,并将该路径添加到我的 tsconfig 中的“包含”选项时,它工作正常:

    {
      // Some other config
      "include": [
        "custom-matchers.d.ts"
      ]
    }
    

    尚未专门使用您的自定义匹配器进行测试,但我遇到了类似的问题,我已经解决了这样的问题。

    所以您的 custom-matchers.d.ts 将是:

    export {}
    
    declare global {
      namespace jest {
        interface Matchers<R, T = {}> {
          toSucceed(): R
        }
      }
    }
    

    【讨论】:

    • 奥斯卡,抱歉耽搁了。你是对的,将“d.ts”文件添加到根级别我可以摆脱 VSCode 警告。我在我的“src/types”目录中将它与我的类型定义的其余部分一起添加,虽然它适用于 Jest,但显然它不适用于 VSCode。
    猜你喜欢
    • 2020-07-07
    • 2018-06-04
    • 1970-01-01
    • 2017-06-20
    • 2020-06-26
    • 2021-12-24
    • 1970-01-01
    • 2023-03-03
    • 2020-02-13
    相关资源
    最近更新 更多