Разрешить столкновение пространства имен / глобальной переменной в Typescript - PullRequest
0 голосов
/ 20 мая 2019

Итак, я пытаюсь начать работу с TypeScript, и у меня возникают некоторые проблемы при его установке в моей тестовой среде.

Как и многие, я использую мокко, чай, синон и синон-чай.Поскольку чай и сам синон используются так часто, я предпочитаю рассматривать их как части моей тестовой среды так же, как глобалы Мокко, такие как describe, it, context, beforeEach и т. Д.

Обычно я включаю в свои тесты установочный файл, который выглядит примерно так:

import chai from 'chai';
import sinon from 'sinon';
import sinonChai from 'sinon-chai';

chai.use(sinonChai);

global.expect = chai.expect;
global.sinon = sinon;

afterEach(function() {
    sinon.restore();
});

Это добавляет утверждения sinon chai, дает мне и expect, и sinon как глобальные, итакже гарантирует, что любые подделки sinon будут восстанавливаться после каждого теста.

Первая проблема здесь, когда я начинаю писать свои тестовые файлы на TypeScript, заключается в том, что tsc не имеет понятия об этих expect и sinonГлобал.Конечно, я могу добавить пакеты @types для всего остального, но мне нужно как-то объявить эти два глобала для себя, или tsc жалуется.

Я пытался добавить test-globals.d.ts, который содержит следующее:

declare const expect: Chai.ExpectStatic;
declare const sinon: Sinon.SinonStatic;

Это прекрасно работает для expect, но не для sinon, потому что @types/sinon по какой-либо причине предоставляет свое пространство имен с использованием строчной буквы 'S.'Поэтому я должен переключить его на это:

declare const expect: Chai.ExpectStatic;
declare const sinon: sinon.SinonStatic;

Но теперь новая глобальная переменная, кажется, затеняет пространство имен, так что это выплевывает cannot find namespace 'sinon'.

Если я попытаюсьчтобы присвоить ему псевдоним перед объявлением global следующим образом:

type SinonStatic = sinon.SinonStatic;

declare const expect: Chai.ExpectStatic;
declare const sinon: SinonStatic;

Этот still , кажется, затеняет пространство имен и дает мне cannot find namespace 'sinon' для первой строки.

Если я попытаюсь использовать псевдоним, используя вместо этого оператор import, то, конечно, это заставит tsc обрабатывать мой файл как модуль и отказываться соблюдать глобальные объявления внутри него, если я не включу одну из этих глупых директив /// во всемои тестовые файлы.

Единственный способ, которым я могу обойти это, - просто вызвать мою глобальную переменную sinon как-нибудь еще или просто импортировать sinon в каждый тестовый файл.

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

Я предпочитаю исключить разветвление @types/sinon, чтобы кстати изменить пространство имен.Я бы действительно предпочел не поддерживать такую ​​вилку над чем-то вроде этого.

...