我已经通过测试验证了两种模式可以从npm发布的模块导入流注释,类型和接口。
接下来我使用下面的模块名称:
对类型和接口使用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",
...
},
npm i --S module-A
的依赖关系使得注释也可用,因为已发布模块的js.flow
目录中的lib/
文件。使用以下语法导入类型和接口:
import type {IComplex, IMutableComplex} from 'module-A';
在放置在declarations.js
目录中的decl
文件中定义类型,接口和模块(指向[libs]
的{{1}}部分):
.flowconfig
无需在type IComplex = { ...
interface IMutableComplex { ...
declare module "module-A" {
declare function foo(i: number): number;
}
脚本中将*.js
文件复制为*.js.flow
prepublish
像以前一样声明依赖项。但是这次没有注释,类型和接口可用,因为“module-A”不包含任何npm i --S module-A
文件,所以...... *.js.flow
文件,并将其放在declarations.js
目录中(从decl
的{{1}}部分指向以上两种模式是我发现的唯一方法,并且已经验证它们有效(尽管我找不到全面的记录)。
我的问题是:
关于问题#1我可以看到“模式2”是唯一可能的方法,如果“模块-A”由另一个组织/个人发布。否则,如果发布两个模块,我认为“模式1”更直接。
答案 0 :(得分:10)
你的观察是完全正确的。这是发布流式定义的两种方法。没有其他方法可以做到这一点,或者更好:官方迁移计划将朝两个方向发展,因为目前,不可能强迫所有JS项目适应流程。
现在,"模式2"描述了我们所说的' libdef'文件或'声明文件'。通过flow-typed
项目,我们尝试为常见的第三方节点模块提供高质量的libdef文件。
两种模式都有它们的上升和下降......销售*.flow.js
文件的最大问题是,它们假定流的特定版本(例如,peerDependency flow-bin不了解您最新使用的句法)。另一方面,它是一种更精简的方法,可以使类型与实际代码库保持同步。
无论如何,这两种方式都是有效的,只需确保您的消费者不必仅为您的包更改其flow
版本。
另一些有用的信息:
flow@0.32
引入了一项名为flow gen-flow-files
的实验性新功能,只需复制类型信息而不是整个代码,就可以更高效的方式创建*.flow.js
。
另外,我在flow-typed上创建了一个问题,它在这里开始完全相同的讨论:https://github.com/flowtype/flow-typed/issues/286
干杯