我有以下文件结构:
(您可以克隆我的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文件的情况。这可以通过以下方式实现:
lib-a/lib-c.d.ts
并将符号链接指向lib-b/lib-c.d.ts
。当然,第1点是有效的
第2点对我不起作用。执行mklink lib-b/lib-c.d.ts lib-a/lib-c.d.ts
(在Windows上)后,TypeScript编译器仍然输出相同的重复标识符错误。
如何引用两个引用相同(但不是相同)依赖关系的模块?
答案 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的修改版本。