现在我确定问题是因为包含了一个d.ts文件,其中包含一个名为" Shared"的模块,以及一个require语句,如果正在使用它,它包含一个同名变量在NodeJS环境中。
// shared.d.ts
declare module Shared { ... }
// other_module.ts
/// <reference path="shared.d.ts"/>
if(require) { var Shared = require("shared"); }
export class Something {
public someVar = new Shared.SomethingElse("blah");
}
所以当我编译other_module.ts
(实际上是很多单独的文件)时,它告诉我Shared是一个重复的标识符,我可以理解,因为TS认为Shared是一个模块,但后来被告知它是要求的回报。
这里的问题是模块的输出需要与nodeJS的require系统兼容,因此在这种情况下,当需要other_module时,它将在其自己的范围内,并且不会知道Shared.SomethingElse
因此需要需要,因此other_module
中的内部模块将能够访问共享库,但在浏览器环境中,它将通过全局范围获得Shared.SomethingElse
。
如果我删除引用,那么文件将不会编译,因为它不知道Shared
,如果我在模块加载到nodejs(var otherModule = require("other_module")
)时删除了require,它会抱怨它不知道Shared
。那么有办法解决这个问题吗?
答案 0 :(得分:6)
重复标识符,因为Shared
+ shared.d.ts
中的other_module.ts
amd
。
如果您想使用commonjs
/ import/require
即。 外部模块,您需要使用var/require
(而非import
,就像您正在做的那样)。使用Shared
创建新变量声明空间,因此您不再从other_module.ts
污染全局命名空间// shared.d.ts
declare module Shared {
export function SomethingElse(arg:string):any;
}
declare module 'shared'{
export = Shared;
}
。简而言之:
// other_module.ts
/// <reference path="shared.d.ts"/>
import Shared = require("shared");
export class Something {
public someVar = new Shared.SomethingElse("blah");
}
类型安全导入:
other_module
如果本地范围是全局范围,则Shared
内部不要在本地使用名称commonjs
。我建议您只使用外部无处不在,并使用amd
编译节点,使用other_module.ts
编译浏览器,如修订版A所示,但如果您必须在此编译固定// other_module.ts
/// <reference path="shared.d.ts"/>
var fooShared: typeof Shared;
if(require) { fooShared = require("shared"); }
else { fooShared = Shared; }
export class Something {
public someVar = new fooShared.SomethingElse("blah");
}
。
{{1}}