ber*_*nie 7 javascript npm typescript definitelytyped typescript-typings
我在npm上发布了两个Javascript库,并且用户要求为它们两者都提供TypeScript类型定义。我自己不使用TypeScript,也没有计划用TypeScript重写这些库,但是我仍然想添加类型定义文件,如果只是为了更好地完成IntelliSense代码。我正在寻找一些建议。
我首先阅读了DefinitelyTyped项目的文档以及有关发布npm包的声明文件的文档。两个来源都指出“对于不在TypeScript中编写的项目,首选方法是在npm上发布到@types组织”。
为什么相比通过库中的types字段将类型定义与库本身一起发布,它为什么更受青睐package.json?我真的看不到让第三方参与其中的意义。似乎更新类型定义并对其进行版本控制更加复杂。
来自DefinitelyTyped:
如果您是库作者,并且您的包是用TypeScript编写的,则将自动生成的声明文件捆绑在您的包中,而不是发布为“确定类型”。
来自typescriptlang.org:
既然您已经按照本指南的步骤编写了声明文件,那么现在该将其发布到npm了。可以将声明文件发布到npm的主要方法有两种:
- 与您的npm软件包捆绑在一起,或者
- 在npm上发布到@types组织。
如果您的程序包是用TypeScript编写的,则首选第一种方法。使用--declaration标志生成声明文件。这样,您的声明和JavaScript将始终保持同步。
如果您的软件包不是用TypeScript编写的,则第二种方法是首选方法。
两者似乎都说:
if (isAuthor && lang === "typescript")
bundle();
else
publishOnDefinitelyTyped();
Run Code Online (Sandbox Code Playgroud)
小智 8
类型声明发布指南在多个领域似乎有点过时且稀疏。
\n我将尝试详细比较这两种情况。
\n一般来说,由于简化的依赖管理,包捆绑类型更加方便。
\n选择不使用包捆绑类型的有限方法
\n涉及消费者需要修改或替换类型声明的情况。
\n由于配置选项已经有限,在具有固执己见的构建设置的项目中,该过程可能会出现相当大的问题。
\n将类型与包捆绑在一起意味着每次发布版本时实际上都会发布两个 API 合约。
\n例子:
\n让我们假设一个旨在符合 semver 版本控制的库。
\n下一个版本的选项有:
\nA.2.XX -> 违反类型声明的 semver 规则
\nB.3.0.0 -> 违反了实际代码的 semver 规则
\n这种情况可能有多种变化。
\n类型对包的发布周期没有影响
\nDT repo 有两个额外的特征:
\n第一个工具可以轻松地合并到另一个包存储库中。\n我不确定分析是否可以复制到自己的存储库中,但它包含大量有价值的数据。
\n支持过去版本的非标准方式
\n受 DT 审核和发布周期限制的类型发布时间表
\n假设 DefinelyTyped PR 创建者是 @types 包所有者,则合并 PR 通常需要一到两天的时间。此外,在 types-publisher 更新 PR 相关的 @types npm 包之前,会有轻微的延迟。
\n当 PR 是作者对给定包的第一个贡献时,会涉及额外的审核过程。
\n使用外部依赖项
\nTypeScript 手册说:
\n\n\n如果您的类型定义依赖于另一个包:
\n不要将\xe2\x80\x99 与你的结合起来,将每个文件保存在自己的文件中。
\n也不要复制包中的声明。
\n如果 npm 类型声明包未打包其声明文件,请务必依赖它。
\n
从冗余实用程序类型的数量来看,这些功能很难得到尊重。
\n类型声明的作者可以使用相邻的 DT 存储库类型。\n依赖于此列表之外的包,要求它们位于类型发布者白名单中。
\n可以通过向 types-publisher 提交 PR 将新包列入白名单。\n我的 PR 花了两周多的时间才被合并。我不知道这是否常见,因为我已经提交了一份 PR。
\nDT 回购量
\n我没有跨 IDE 的比较或经验,但就 JetBrains IDE 而言,完全索引的 DT repo 项目的内存占用导致 IDE 无法使用。
\n禁用对更改的重新编译在一定程度上有所帮助。可以通过删除与感兴趣的包不相关的 DT 存储库内容来解决令人沮丧的 IDE 体验。
\n