间接引用相同的模块两次

时间:2014-10-29 13:55:21

标签: compiler-errors typescript

我有以下文件结构:
(您可以克隆我的GitHub repo以重现错误。)

client.ts
|
|-- references lib-a/lib-a.ts
|             |
|             |-- references lib-a/lib-c.d.ts
|
|-- references lib-b/lib-b.ts
              |
              |-- references lib-b/lib-c.d.ts (equal to lib-c.d.ts)

lib.c.d.ts:

declare module "lib-c" {
    interface LibC {
        dummyAttribute: number;
    }
}

编译client.ts显然会导致错误,因为相同的 dummyAttribute 被声明两次。

lib-b/lib-c.d.ts(3,9): error TS2300: Duplicate identifier 'dummyAttribute'.

有没有办法强制TypeScript编译器忽略此错误或将搜索重复“限制”到一个级别?

在不触及编译器的情况下,我只能想象一个解决方案,导致lib-a和lib-b指向相同的(而不是相同的)lib-c文件的情况。这可以通过以下方式实现:

  1. 更改lib-a或lib-b。这是一个肮脏的黑客,因为更新将覆盖更改。
  2. 删除lib-a/lib-c.d.ts并将符号链接指向lib-b/lib-c.d.ts
  3. 当然,第1点是有效的 第2点对我不起作用。执行mklink lib-b/lib-c.d.ts lib-a/lib-c.d.ts(在Windows上)后,TypeScript编译器仍然输出相同的重复标识符错误。

    如何引用两个引用相同(但不是相同)依赖关系的模块?

1 个答案:

答案 0 :(得分:3)

解决方案是确保以可预测的方式管理依赖关系。

例如,如果您使用来自Definitely Typed的.d.ts个文件并通过NuGet加载它们,那么它们会使用包依赖关系来确保您只获得每个依赖项的一个副本。

让我们以jQuery为例。

如果我们将jQuery与每个需要它的库打包在一起,那么我们最终会遇到你所描述的情况:

- /Scripts
- - /jqueryui
- - - jquery.ui.d.ts
- - - jquery.d.ts
- - /jquerymobile
- - - jquerymobile.d.ts
- - - jquery.d.ts

这会导致问题,因为这会引入重复的定义。对于"它们都是相同的库"你可能会说你想忽略它们,但是如果两个完全不同的库在全局命名空间中竞争相同的名称,你将会遇到运行时问题。

为了解决您描述的情况,在为jQuery UI和jQuery mobile安装NuGet包时(如上例所示),您实际上最终会得到以下结果:

- /Scripts
- - /jqueryui
- - - jquery.ui.d.ts
- - /jquerymobile
- - - jquerymobile.d.ts
- - /jquery
- - - jquery.d.ts

这是分享依赖关系的正确方法。

此结构也反映在Definitely Typed存储库中,因此jQuery UI和jQuery mobile都指向相同的相对jQuery定义。

我不确定某些事情可以如何平等但不相同"在你的问题中 - 也许你有相同的东西的不同版本的库...这个问题的答案很大程度上取决于你如何解决运行时问题(例如,如果你使用两个版本的jQuery,你可能正在将一个版本分配给全局范围中的其他名称以避免冲突,在这种情况下,您还需要具有该全局名称的jquery.d.ts的修改版本。