2

现在我确定问题是因为包含一个 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。那么有没有办法解决这个问题?

4

1 回答 1

6

首先是错误

重复的标识符,因为您有Sharedin shared.d.ts+ in other_module.ts

FIX A,都是外部的

如果你想使用amd/commonjs即。external modules,你需要使用import/requirevar/require不像你正在做的那样)。使用 animport创建一个新的变量声明空间,因此您不再污染全局命名空间Sharedother_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");
}

FIX B,就像你一样,但你需要使用不同的名字

如果本地范围是全局范围,则内部other_module不要在本地使用名称。我建议你在任何地方都使用 external 并为 node with和 browser with编译,如修复 A 所示,但如果你必须在这里是一个 compile fixed 。Sharedcommonjsamdother_module.ts

// 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");
}
于 2014-06-21T11:23:41.033 回答