typescript - Ako môžem nahradiť typ Jest expect typom Chai expect?


Chcem používať Chai ako knižnicu tvrdení namiesto tej od Jest. Používam TypeScript a chcel by som nahradiť globálne Jest expect typom Chai expect.

Snažím sa urobiť niečo takéto:

import chai from "chai";

type ChaiExpect = typeof chai.expect;

declare global {
  export const expect: ChaiExpect;
}

global.expect = chai.expect;

Ale TypeScript sťažuje, pretože:

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

Ako môžem prepísať typ deklarovaný vo index.d.ts pre jest?

Odpoveď č. 1

Na strane JavaScriptu môžete znovu priradiť runtime hodnotu global.expect, na strane TypeScriptu však nie je jednoduché riešenie.

Jest deklaruje expect ako globálnu premennú (pozri @types/jest/index.d.ts(39, 15)). V súčasnosti TypeScript neposkytuje spôsob, ako prepísať typ už deklarovanej premennej v rovnakom blokovom rozsahu.

Takže pokiaľ si ponecháte @types/jest/index.d.ts tak, ako je, nič nemôžete urobiť, aby ste tento chybový hlásenie potlačili.

Riešenie

1. Ľahká cesta

Najjednoduchší spôsob, ako používať expect z balíka chai, je jednoducho ho importovať a používať v každom súbore .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)
});

2. Ťažkou cestou

A teraz, ak naozaj nemôžete žiť s tým opakujúcim sa riadkom import { expect } from 'chai', tu je náročnejšia cesta:

  1. Presuňte node_modules/@types/jest do types/jest, uistite sa, že v priečinku node_modules už nie je. Tiež odstráňte "@types/jest" z "package.json => devDependencies".

  2. Upravte types/jest/index.d.ts, nahraďte typ expect typom z chai. Tento prispôsobený typ deklarácie musíte commitnúť do svojho git repozitára.

// index.d.ts

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

- declare const expect: Expect
+ declare const expect: Chai.ExpectStatic
  1. Vo vašom tsconfig.json pridajte:
{
  "compilerOptions": {
    "typeRoots": ["node_modules/@types", "types"],
    ...
}
  1. Vytvorte jestSetup.js a pridajte tento jednoradový kód:
global.expect = require("chai").expect
  1. v jest.config.js nastav:
setupFilesAfterEnv: ['./jestSetup.js'],
// or `setupTestFrameworkScriptFile` for older version.

Tu to máš. Teraz môžeš používať chai expect priamo v globálnom rozsahu.