d.ts文件和nodejs需要具有相同名称的重复标识符错误

时间:2014-06-21 10:34:01

标签: javascript node.js typescript tsc

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

1 个答案:

答案 0 :(得分:6)

首先是错误

重复标识符,因为Shared + shared.d.ts中的other_module.ts amd

FIX A,全部为外部

如果您想使用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

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

如果本地范围是全局范围,则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}}