Typescript ';无法重新声明块作用域变量';在不相关的文件中

Typescript ';无法重新声明块作用域变量';在不相关的文件中,typescript,tsc,Typescript,Tsc,有一个简单的TS包用作CommonJS模块,没有导出。TS文件被编译成具有相同名称的JS文件,并用作require('package/option foo') tsconfig.json: { "compilerOptions": { "target": "es5" } } option-foo.ts: declare const GlobalVar: any; function baz() {} if (GlobalVar.foo) GlobalVar.baz = baz

有一个简单的TS包用作CommonJS模块,没有导出。TS文件被编译成具有相同名称的JS文件,并用作
require('package/option foo')

tsconfig.json:

{
  "compilerOptions": {
    "target": "es5"
  }
}
option-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文件,但它们不影响任何东西,只需要在一次
tsc
运行中传输到JS

tsc
运行时,它抛出

无法重新声明块作用域变量“GlobalVar”

重复功能实现

无法重新声明块作用域变量“GlobalVar”

重复功能实现

用于两个文件中的
GlobalVar
baz


如何在不使生成过程或这两个TS文件的输出复杂化的情况下处理此问题?

GlobalVar
,函数暴露于全局命名空间,TypeScript警告您重新声明变量和方法名称。因为这两个函数是在全局命名空间中声明的,所以只需声明一次

如果要执行此操作,请使用名称空间

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

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

您可以使用名称空间名称,以与在C#中调用函数相同的方式调用函数:
bar.baz
foo.baz

TL;DR只需在文件的最外层范围内写入
导出{}


在某种程度上,需要进行语义消歧,以确定文件应被视为模块(并具有自己的作用域)还是脚本(并与其他脚本共享全局作用域)

在浏览器中,这很简单-您应该能够使用
标记,并且能够使用模块

但是其他使用JavaScript的地方呢?不幸的是,在这一点上没有一个标准的方法来区分

TypeScript解决这个问题的方法是简单地声明模块是包含导入或导出的任何文件

因此,如果您的文件没有任何类型的顶级
import
export
语句,那么您偶尔会看到全局声明相互干扰的问题

为了解决这个问题,您可以使用一个简单的
export
语句,该语句不导出任何内容。换言之,只要写

export {};

在文件顶层的某个地方。

在这种特定情况下,您可以拥有类似于
custom typings.d.ts
的文件,如果它们都是
any
,只需在那里声明即可。您还可以尝试更改所需的
--模块
编译(尝试AMD/System,因为我相信它们会单独作用于文件)。再想一想,我最终使用了这个解决方案,它很管用。谢谢。这是对这个问题最好的解释。这个问题使我困惑了很久。今天,我终于找到了原因。所以是TS编译器在抱怨,而不是运行时的问题,令人讨厌。有没有一种方法可以忽略像这样的TS错误?它会一直工作到最终出现SyntaxError:意外的令牌导出。我希望他们能接受这是NodeJS的typescript中的一个bug,并为它开发一个修复程序。为什么TS认为导入是一个重新声明?模块的作用域是有限的。TS应该真的修复这个错误。。