如何从npm发布的模块导入流注释,类型和接口

Mar*_*tus 9 node.js npm flowtype

我通过测试验证了两种模式可以从npm发布的模块导入流注释,类型和接口.

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

  • 模块A:定义注释,类型和接口
  • 模块B:依赖于模块A并希望对其进行类型检查,并使用其注释,类型和接口.

模式1

模块A.

  • 使用export type类型和接口的语法:

    type IComplex ...
    interface IMutableComplex ...
    export type {IComplex, IMutableComplex}
    
    Run Code Online (Sandbox Code Playgroud)
  • 将所有*.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",
        ...
     },
    
    Run Code Online (Sandbox Code Playgroud)
  • 发布模块

模块B.

  • 简单地声明依赖性npm i --S module-A使得注释也可用,因为已发布模块js.flowlib/目录中的文件.
  • 使用以下语法导入类型和接口:

    import type {IComplex, IMutableComplex} from 'module-A';
    
    Run Code Online (Sandbox Code Playgroud)

模式2

模块A.

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

    type IComplex = { ...
    interface IMutableComplex { ...
    declare module "module-A" {
        declare function foo(i: number): number;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 无需复制*.js文件,*.js.flowprepublish脚本

  • 发布模块

模块B.

  • 像以前一样声明依赖项npm i --S module-A.但是这次没有注释,类型和接口可用,因为"module-A"不包含任何*.js.flow文件,所以...
  • 手动获取declarations.js从"模块-A"包文件,并将其放置在decl目录(从指向[libs]的部分.flowconfig
  • 无需使用任何语法来导入类型和接口; 它们会自动变为可用.

以上两种模式是我发现的唯一方法,并且已经验证它们有效(尽管我找不到全面的写法).

我的问题是:

  1. 哪种模式更惯用/可取?
  2. 还有另一种模式吗?

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

小智 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

干杯