gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:18:26 29 4
gpt4 key购买 nike

现在我确定问题是因为包含一个 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 时删除 require (var otherModule = require( "other_module")) 它会提示它不知道Shared。那么有什么办法可以解决吗?

最佳答案

首先是错误

标识符重复,因为您有 Sharedshared.d.ts + 在 other_module.ts .

FIX A,全部为外部

如果你想使用amd/commonjs IE。 外部模块,你需要使用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");
}

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

内部other_module不要使用名称 Shared如果本地作用域是全局作用域,则在本地。我建议你在任何地方都使用外部并使用 commonjs 为 Node 编译和浏览器 amd如修复 A 所示,但如果您必须,这里是一个编译修复 other_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");
}

关于javascript - d.ts 文件和 nodejs 需要具有相同名称的重复标识符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24340741/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com