如何从节点模块中的@types 保存类型

Posted

技术标签:

【中文标题】如何从节点模块中的@types 保存类型【英文标题】:How to save a type from @types in a node module 【发布时间】:2019-02-27 17:11:11 【问题描述】:

我的问题源于以下场景:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

如果包 B 真的是一个独立的包,那么你应该只在 A 中包含来自 B 的编译的 .js 文件和 .d.ts 文件(如果你当前没有生成,请参阅 TypeScript's compiler options 中的 --declaration 标志.d.ts 文件)。这应该避免 TypeScript 尝试为 C 和 D 查找类型。

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

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

【讨论】:

问题是我暴露了从 C 和 D 到 B 的类型。声明等效接口时我遇到的唯一问题是如果 C 和 D 中的接口发生变化......我想我只是有更新版本时要非常小心。 这绝对是一个软件设计问题...如果 B 只是围绕 C 和 D 的某种辅助库(听起来可能是这样?),最好让 A 知道C 和 D 否则你只会重复很多类型定义并给自己带来一些不必要的麻烦。另一方面,如果 B 正在执行一些离散的任务,隐藏 C 和 D 使您能够在未来升级或替换 C 和 D,而 A 不必关心。

以上是关于如何从节点模块中的@types 保存类型的主要内容,如果未能解决你的问题,请参考以下文章

从 Power Query 中的单元格值中提取数据类型?

视频到音频文件通过节点 js 中的 FFMPEG 转换和保存

区分其他模块中的节点主集群

Redis数据结构之字典

Netbeans API:如何保存文件,或当前项目中的所有文件?

如何从laravel中保存mysql中的单选按钮值