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

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

tsconfig.в JSON:

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

опция-foo.ТС:

declare const GlobalVar: any;

function baz() {}

if (GlobalVar.foo) GlobalVar.baz = baz;
.ТС:
declare const GlobalVar: any;

function baz() {}

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

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

, когда tsc запускается, он выдает

не удается переопределить переменную с областью блоков "GlobalVar".

дублировать реализацию функции.

не удается переопределить переменную с областью блоков "GlobalVar".

дублировать реализацию функции.

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

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

2 ответов


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


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

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

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

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

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

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

export {};

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


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

если вы хотите сделать это, используйте пространства имен.

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

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

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