问题:有没有人有一个解决方案,我的实用程序模块和/或库可以以此方式声明该模块,以使所有下游模块/应用程序都知道在哪里找到类型(使用零操作) )?
我会解释...
我正在编写一个用TypeScript编写的实用程序模块,并将其插入其他应用程序将使用的库模块中。该实用程序模块依赖于非TypeScript模块(我没有能力对其进行影响)。库模块最终将被拉入一个或多个TypeScript应用程序(“客户端”)。这是基本图:
app(s) (TS)
<-library module (TS)
<-utility module (TS)
<-dependency (JS)
要使JavaScript依赖项在我的实用程序模块中起作用,我做了以下工作:
"typeRoots": [ "./@types", "./node_modules/@types" ],
添加到了我的tsconfig。@types/js-dependency/index.d.ts
声明了JS模块,并导出了所需的类型。对于实用程序模块,这非常有效。还没有问题。当我将实用程序模块导入库模块时,就会出现问题。当我这样做时,构建库模块。我收到以下错误:
error TS2688: Cannot find type definition file for 'js-dependency'.
1 /// <reference types="js-dependency" />
这很有意义,我可以确切地知道它为什么会发生。在我的实用程序模块的基本dist/index.d.ts
文件中,它具有上面的三斜杠指令...以及几种导出的类型,如下所示:import("js-dependency").default
。 TS会在“ js依赖项”中寻找这些类型...
默认情况下,当库模块去寻找JS依赖模块时(在模块中找不到它们),它唯一能看到的地方是在node_modules/@types
目录中。如果找不到它们,则会引发错误。
我有几种方法可以解决此问题(从最初导入它的实用程序模块开始):
@types/js-dependency
模块,将其发布并带入需要它的任何TS项目中。问题:尽管从技术上讲这是可行的,但是js-dependency
并不是我的,而且实际上也不是我代表作者发布此内容的地方。"@types/js-dependency": "./@types/js-dependency",
中将其引入dev依赖项中。因此,它将在npm安装时复制到node_modules/@types/js-dependency
。问题:由于它是一个dev依赖项,因此仍然无法在下游修复,因此这不会触发采用库模块将其安装在同一位置,并且仍然会抱怨找不到类型defs。因此,两者的问题在于,两者都无法真正解决问题并为下游模块自动定义模块。因此,无论哪种情况,我仍然需要将@types/js-dependency
安装到库模块的开发依赖项中(这是最糟糕的部分),任何使用该库模块的客户端应用程序也必须这样做。
期望实用程序模块(直接使用JS依赖项)必须处理声明问题是100%合理的。但是,库模块和客户端应用程序都没有与“ js-dependency”的直接交互,也从未明确使用它。
因此,通过将此依赖关系引入我的实用程序模块,我为下游客户端造成了困扰。从来没有困难的解决方法……但是下游客户端可能不了解“ js依赖项”是什么或为什么他们需要它(因为对他们来说,它是依赖项的依赖项)。当我安装一个模块时,我希望必须处理那个模块问题,但不是它的依赖关系问题。
所以,回到问题所在:有没有人有一个解决方案,我的实用程序模块和/或库可以以此方式声明该模块,以使所有下游模块/应用程序都知道在哪里找到类型(使用ZERO行动)?