VSCode 无法识别开玩笑的自定义匹配器

Posted

技术标签:

【中文标题】VSCode 无法识别开玩笑的自定义匹配器【英文标题】:VSCode does not recognize jest custom matcher 【发布时间】: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 根内的类型定义,因为它是我无法直接扩充的类型。

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

【问题讨论】:

【参考方案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。

以上是关于VSCode 无法识别开玩笑的自定义匹配器的主要内容,如果未能解决你的问题,请参考以下文章

Blackberry Bold - 无法识别 URL 甚至注册的自定义模式

VS Code Python 无法识别匹配语句

React 包装器:React 无法识别 DOM 元素上的 `staticContext` 道具

React 包装器:React 无法识别 DOM 元素上的 `staticContext` 道具

开玩笑在 Expo 上运行时无法识别 .jsx 文件

带有打字稿的玩笑无法识别功能完成()