现在我确定问题是因为包含一个 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 是一个模块,但随后被告知它是 require 的返回。
这里的问题是模块的输出需要与 nodeJS 的 require 系统兼容,所以在这种情况下,当需要 other_module 时,它将在自己的范围内并且不会知道Shared.SomethingElse
所以需要 require,所以内部模块other_module
将是能够访问共享库,但在浏览器环境中它将Shared.SomethingElse
通过全局范围获得。
如果我删除了引用,那么文件将无法编译,因为它不知道Shared
,如果我在模块加载到 nodejs( var otherModule = require("other_module")
) 时删除了 require,它会抱怨它不知道Shared
。那么有没有办法解决这个问题?