如何用 Chai 期望替换 Jest 期望的类型?

Dav*_*vet 2 chai typescript jestjs

我想使用 Chai 作为断言库,而不是 Jest。我使用打字稿,我想用 Chai 期望的类型替换全局 Jest 期望。

我尝试做类似的事情:

import chai from "chai";

type ChaiExpect = typeof chai.expect;

declare global {
  export const expect: ChaiExpect;
}

global.expect = chai.expect;
Run Code Online (Sandbox Code Playgroud)

但打字稿抱怨是因为:

Cannot redeclare block-scoped variable 'expect'.ts(2451)
index.d.ts(39, 15): 'expect' was also declared here.
Run Code Online (Sandbox Code Playgroud)

如何覆盖 jest 内部index.d.ts声明的类型?

hac*_*ape 5

您可以在 javascript 端重新分配global.expect的运行时值,但是在打字稿端,没有简单的方法。

Jest 声明expect全局变量(请参阅 参考资料@types/jest/index.d.ts(39, 15))。目前,打字稿无法在同一块作用域中覆盖易于声明的变量的类型

因此,只要保持@types/jest/index.d.ts现状,就无法抑制该错误。


解决方案

1.简单的方法

使用 chai 的最简单方法就是在每个文件expect中导入并使用它:.test.ts

// sum.test.ts
import { expect } from 'chai'
import { sum } from './sum';

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).eq(3)
});
Run Code Online (Sandbox Code Playgroud)

2.艰难的道路

现在,如果你真的无法忍受那条重复的import { expect } from 'chai'线,这里有一条更难的路:

  1. 移至,确保它已消失在文件夹node_modules/@types/jest中。还要从“package.json => devDependencies”中删除“@types/jest”。types/jestnode_modules

  2. 修改types/jest/index.d.ts,将 的类型替换expect为 chai 的。您需要将此自定义类型声明提交到您的 git 存储库。

// index.d.ts

+ /// <reference types="chai" />

- declare const expect: Expect
+ declare const expect: Chai.ExpectStatic
Run Code Online (Sandbox Code Playgroud)
  1. 在您的 中tsconfig.json,添加:
{
  "compilerOptions": {
    "typeRoots": ["node_modules/@types", "types"],
    ...
}
Run Code Online (Sandbox Code Playgroud)
  1. 创建jestSetup.js并添加这一行:
global.expect = require("chai").expect
Run Code Online (Sandbox Code Playgroud)
  1. jest.config.js,设置:
setupFilesAfterEnv: ['./jestSetup.js'],
// or `setupTestFrameworkScriptFile` for older version.
Run Code Online (Sandbox Code Playgroud)

就这样吧。expect您现在可以在全局范围内使用 chai 。