Node.js 如何从npm发布的模块导入流注释、类型和接口
我已经通过测试验证了两种模式可以从npm发布的模块导入流注释、类型和接口 在以下内容中,我将使用以下模块名称:Node.js 如何从npm发布的模块导入流注释、类型和接口,node.js,npm,flowtype,Node.js,Npm,Flowtype,我已经通过测试验证了两种模式可以从npm发布的模块导入流注释、类型和接口 在以下内容中,我将使用以下模块名称: 模块A:定义注释、类型和接口 模块B:依赖于模块A并希望对其进行类型检查,并使用其注释、类型和接口 模式1 模块A 将导出类型语法用于类型和接口: type IComplex ... interface IMutableComplex ... export type {IComplex, IMutableComplex} 将所有*.js文件复制为*.js.flow。例如,在p
- 模块A:定义注释、类型和接口
- 模块B:依赖于模块A并希望对其进行类型检查,并使用其注释、类型和接口
- 将导出类型语法用于类型和接口:
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", ... },
- 发布模块
- 由于发布模块的
目录中的lib/
文件,只需使用js.flow
声明依赖关系,就可以使用注释npm i--S module-A
- 使用以下语法导入类型和接口:
import type {IComplex, IMutableComplex} from 'module-A';
- 在
目录下的decl
文件中定义类型、接口和模块(指向declarations.js
的.flowconfig
部分):[libs]
- 无需在
脚本中将预发布
文件复制为*.js
*.js.flow
- 发布模块
- 使用
像以前一样声明依赖关系。但是,这次没有可用的注释、类型和接口,因为“module-A”不包含任何npmi--S module-A
文件,所以*.js.flow
- 从“module-A”包手动获取
文件,并将其放置在declarations.js
目录中(指向decl
的.flowconfig
部分[libs]
- 无需使用任何语法来导入类型和接口;它们将自动可用
关于问题1,我可以看到,如果“模块A”由另一个组织/个人发布,“模式2”是唯一可能的方法。否则,如果一个组织/个人同时发布两个模块,我认为“模式1”更直接。您的观察完全正确。以下是发布流类型定义的两种方法。没有其他方法可以做到这一点,或者更好:官方迁移计划将朝着两个方向发展,因为目前不可能强制所有JS项目都适应流 现在,“模式2”描述了我们称之为“libdef”文件或“声明文件”的内容。在该项目中,我们尝试为常见的第三方节点模块提供高质量的libdef文件 这两种模式都有其优点和缺点…vendoring
*.flow.js
文件的最大问题是,它们假定流的特定版本(例如PeerDependence flow bin不理解您最新使用的语法)。另一方面,这是一种更精简的方法,可以使类型与实际的代码库保持同步
无论如何,这两种方法都是有效的,只是要确保您的消费者不会仅仅为了您的软件包而被迫更改他们的流
版本
另一些有用的信息:
flow@0.32
引入了一个名为flow gen flow files
的实验性新功能,它将通过复制类型信息而不是整个代码,以更高效的方式创建*.flow.js
另外,我在flow Type上创建了一个问题,在这里开始了完全相同的讨论:
干杯它应该是
.js.flow
还是.flow.js
?将gen flow文件
集成到捆绑包(如汇总或网页包)中的推荐方法是什么?
type IComplex = { ...
interface IMutableComplex { ...
declare module "module-A" {
declare function foo(i: number): number;
}