Как я могу заменить тип ожидания Jext на ожидания Chai? - PullRequest
1 голос
/ 13 апреля 2019

Я хочу использовать Чай как библиотеку утверждений вместо Jest. Я использую машинопись, и я хотел бы заменить глобальное ожидание Jest типом ожидания Чай.

Я пытаюсь сделать что-то вроде:

import chai from "chai";

type ChaiExpect = typeof chai.expect;

declare global {
  export const expect: ChaiExpect;
}

global.expect = chai.expect;

Но машинопись жалуется, потому что:

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

Как я могу переопределить тип, объявленный внутри index.d.ts шутки?

1 Ответ

2 голосов
/ 13 апреля 2019

Вы можете переназначить значение времени выполнения global.expect на стороне javascript, однако на стороне машинописного текста нелегкий выход.

Jest объявляет expect как глобальную переменную (см. @types/jest/index.d.ts(39, 15)). В настоящее время машинопись не позволяет переопределить тип легко объявленной переменной в той же области видимости блока .

Так что, пока вы держите @types/jest/index.d.ts таким, какой вы есть, вы ничего не можете сделать, чтобы подавить эту ошибку.


Решение

1. Простой способ

Самый простой способ использовать Chai's 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)
});

2. Трудный путь

Теперь, если вы действительно не можете жить с этой повторяющейся линией import { expect } from 'chai', вот трудный путь:

  1. Переместите node_modules/@types/jest в types/jest, убедитесь, что он находится в папке node_modules. Также удалите «@ types / jest» из «package.json => devDependencies».

  2. Изменить types/jest/index.d.ts, заменить тип expect на Chai. Вам необходимо зафиксировать это персонализированное объявление типа в вашем git-репо.

// index.d.ts

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

- declare const expect: Expect
+ declare const expect: Chai.ExpectStatic
  1. В вашем tsconfig.json добавьте:
{
  "compilerOptions": {
    "typeRoots": ["node_modules/@types", "types"],
    ...
}
  1. Создайте jestSetup.js и добавьте однострочник:
global.expect = require("chai").expect
  1. в jest.config.js, набор:
setupFilesAfterEnv: ['./jestSetup.js'],
// or `setupTestFrameworkScriptFile` for older version.

Вот, пожалуйста. Теперь вы можете использовать chai expect прямо в глобальной области видимости.

...