首页 > 解决方案 > 如何从节点模块中的@types 保存类型

问题描述

我的问题源于以下情况:

我正在使用 Typescript 处理包 A。我也在 Typescript 中编写了包 B,它将作为依赖项添加到包 A 中。

包 B 使用两个 javascript 模块(C 和 D)并直接从它们各自的 @types 库(@types/C 和 @types/D)导入类型。

虽然包 B 可以构建,因为它在 dev 依赖项中有 @types,但包 A 不会,因为它会抱怨它在自己的依赖项中没有 C 和 D 的定义。

有什么办法可以让 A 构建,但有以下限制:

  1. A 不会将 C 和 D 的类型作为开发依赖项
  2. B 不会将类型包含为非开发依赖项
  3. noImplicitAny必须在 ts-config 中设置为 true

我希望的是一种方法,要么在 B 中声明基本上是 C 和 D 中类型的副本的新类型,要么让 A 在某种程度上不关心其节点模块中的编译问题。

标签: typescript

解决方案


如果包 B 确实是一个独立的包,那么您应该只在 A 中包含已编译的.js文件和.d.ts来自 B 的文件(如果您当前没有生成文件,请参阅TypeScript 编译器选项--declaration中的标志)。这应该避免 TypeScript 试图为 C 和 D 寻找类型。.d.ts

但是,如果您从 B 公开的接口包含来自 C 和 D 的类型,那么事情就会变得更加棘手。您可以:

  • 让 B 将其自己的(等效)接口声明为其接口的一部分,这是正确的,因为您从 A 中隐藏了 C 和 D。就 A 而言,C 和 D 被视为 B 的无关实现细节。
  • 承认 A 实际上确实需要了解 C 和 D,并将它们作为其开发依赖项的一部分。

推荐阅读