如何从npm发布的模块导入stream注释,types和接口

我已通过testingvalidation了可以从npm发布的模块中导入stream注释,types和接口的两种模式。

在下面我使用下面的模块名称:

  • 模块A:定义注释,types和接口
  • 模块B:依赖于模块A并希望对它进行types检查,并使用它的注释,types和接口。

模式1

模块A

  • 对于types和接口都使用export type语法:

     type IComplex ... interface IMutableComplex ... export type {IComplex, IMutableComplex} 
  • 将所有*.js文件复制为*.js.flow 。 例如在package.json有如下的内容:

     "main": "lib/index.js", "scripts": { "prepublish": "mkdir -p lib && for f in $(find src/ -iname *.js | cut -c5-) ; do cp src/$f lib/$f.flow; done", ... }, 
  • 发布模块

模块B

  • 简单地用npm i --S module-A声明依赖关系npm i --S module-A使得注释可用,因为发布的模块的lib/目录中的js.flow文件。
  • 使用以下语法导入types和接口:

     import type {IComplex, IMutableComplex} from 'module-A'; 

模式2

模块A

  • 定义放置在decl目录(指向.flowconfig[libs]部分)的declarations.js文件中的types,接口和模块:

     type IComplex = { ... interface IMutableComplex { ... declare module "module-A" { declare function foo(i: number): number; } 
  • 不需要在prepublish脚本*.js.flow *.js文件复制为*.js.flow

  • 发布模块

模块B

  • 像之前一样用npm i --S module-A声明依赖关系。 但是这一次没有注释,types和接口可用,因为“module-A”不包含任何*.js.flow文件,所以…
  • 手动从“module-A”包中获取declarations.js文件,并将其放置在decl目录中(从.flowconfig[libs]部分.flowconfig
  • 不需要使用任何语法来导入types和接口; 他们成为自动可用。

以上两种模式是我发现的唯一方法,并且已经validation了它们的工作原理(尽pipe我找不到全面的文字)。

我的问题是:

  1. 哪种模式更习惯/明智?
  2. 还有另一种模式吗?

关于问题#1,我可以看到“模式2”是唯一可能的方法,如果“模块-A”由另一个组织/个人发布。 否则,如果一个人发布这两个模块,我认为“模式1”更直接。

你的观察完全正确。 这是发布你的stream型定义的两种方法。 没有其他办法可以做,甚至更好:官方的移民计划将会双向进行,因为现在不可能迫使所有的JS项目适应stream程。

现在,“模式2”描述了我们所说的“libdef”文件或“声明文件”。 通过flow-typed项目,我们尝试为常见的第三方节点模块提供高质量的libdef文件。

这两种模式都有其*.flow.js和缺点… *.flow.js文件的最大问题是,它们假定stream程的特定版本(例如peerDependency flow-bin不理解您最新使用的语法)。 另一方面,保持与实际代码库同步的types是一个比较简单的方法。

无论如何,这两种方法都是有效的,只要确保你的消费者不被迫改变他们的flow版本只是为你的包。

另外一些有用的信息:

flow@0.32引入了一个名为flow gen-flow-files的实验性新function,它将通过复制types信息而不是整个代码,以更高效的方式创build*.flow.js

另外,我创build了一个关于flow-typed的问题,在这里开始完全相同的讨论: https : //github.com/flowtype/flow-typed/issues/286

干杯