如何从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”是唯一可能的方法,如果“模块-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
干杯