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