"Невозможно переопределить переменную с блочным диапазоном" в несвязанных файлах

Существует простой пакет TS, который используется как модули CommonJS и не имеет экспорта. Файлы TS скомпилированы в файлы JS с тем же именем и используются как require('package/option-foo').

tsconfig.json:

{
  "compilerOptions": {
    "target": "es5"
  }
}

опционные-foo.ts:

declare const GlobalVar: any;

function baz() {}

if (GlobalVar.foo) GlobalVar.baz = baz;

опционные-bar.ts:

declare const GlobalVar: any;

function baz() {}

if (GlobalVar.bar) GlobalVar.baz = baz;

Важная часть здесь состоит в том, что option-foo и option-bar никогда не используются вместе. В проекте есть другие бесплатные TS файлы, но они ничего не влияют, просто нужно перевести на JS за один запуск tsc.

Когда tsc запускается, он бросает

Невозможно переопределить переменную с диапазоном "GlobalVar".

Реализация повторяющейся функции.

Невозможно переопределить переменную с диапазоном "GlobalVar".

Реализация повторяющейся функции.

для GlobalVar и baz в обоих файлах.

Как это можно обрабатывать без осложнения процесса сборки или вывода из этих двух файлов TS?

Ответы

Ответ 1

TL; DR Просто напишите export {} в самой внешней области ваших файлов.


В какой-то момент должна быть смысловая неоднозначность для того, должен ли файл обрабатываться как модуль (и иметь свою собственную область) или script (и совместно использовать глобальную область с другими скриптами).

В браузере это легко - вы можете использовать тег <script type="module">, и вы сможете использовать модули.

Но как насчет любого другого места, использующего JavaScript? К сожалению, на данный момент нет стандартного способа сделать это различие.

Способ, которым TypeScript решил решить проблему, состоял в том, чтобы просто указать, что модуль представляет собой любой файл, который содержит импорт или экспорт.

Поэтому, если ваш файл не имеет каких-либо операторов верхнего уровня import или export, вы иногда будете видеть проблемы, связанные с глобальными объявлениями, мешающими друг другу.

Чтобы обойти это, вы можете просто иметь оператор export, который ничего не экспортирует. Другими словами, просто напишите

export {};

где-то на верхнем уровне вашего файла.

Ответ 2

GlobalVar и функции отображаются в глобальном пространстве, а typescript предупреждает вас, что переменная и имя метода повторно объявлены как есть. потому что две функции объявлены в глобальном пространстве имен, вам нужно только объявить одно время. Если вы хотите это сделать. Использовать пространства имен

namespace foo{    
    declare const GlobalVar: any;
    function baz() {}

}

namespace bar{
declare const GlobalVar: any;
function baz() {}
}

вы можете вызвать функцию как в С#, используя имя пространства имен до bar.baz, foo.baz

Надеюсь, что эта помощь вам поможет.