"Невозможно переопределить переменную с блочным диапазоном" в несвязанных файлах
Существует простой пакет 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
Надеюсь, что эта помощь вам поможет.