Javascript 创建使用流类型并公开类型的JS库

Javascript 创建使用流类型并公开类型的JS库,javascript,reactjs,types,flowtype,Javascript,Reactjs,Types,Flowtype,我正在写一个将被第三方使用的库。我选择flowtype作为键入系统(由于我所在的组织的特殊原因)。该库公开带注释的React组件 该库使用flowtype进行注释。我还希望能够在具有flowtype的其他代码中使用它。我在库中创建了index.flow.js,并将以下内容放入其中: // @flow import type MyComponent from './components/my-component' export default MyComponent // some othe

我正在写一个将被第三方使用的库。我选择flowtype作为键入系统(由于我所在的组织的特殊原因)。该库公开带注释的React组件

该库使用flowtype进行注释。我还希望能够在具有flowtype的其他代码中使用它。我在库中创建了
index.flow.js
,并将以下内容放入其中:

// @flow

import type MyComponent from './components/my-component'

export default MyComponent

// some other types follow
...
当我尝试在不同的代码库中使用该库时,类型“不起作用”。例如,如果我将无效的prop传递给组件,则类型系统不会抛出任何错误。我的代码库也是使用flowtype输入的

我应该在库的
index.flow.js
文件中声明我的React-in组件吗?这看起来很尴尬,因为现在我必须在两个地方维护类型(组件本身和流文件)


我认为默认情况下该流是有效的。由于我的React组件是类型化的,并且库正在公开
index.flow.js
,它会识别出该组件具有特定的道具、状态等类型,但它没有。

因此经过一些研究,我得出结论,有两种方法:

1。公开单个定义文件 确保创建的定义文件与您的发行版JS文件名相同。这意味着,如果您的库
lib-a
带有捆绑文件
lib-a.js
,请将定义文件命名为
lib-a.js.flow
。按照流程文档说明如何正确定义模块

使用这种方法,您需要在其中声明整个模块。这意味着如果你有一个类
MyComponent
,你需要在这里再次定义它

我不喜欢这种方法,因为所有东西都需要放在一个地方。在源代码中,然后需要从定义文件导入类型,这样就不会重复类型定义。这并不是很好,例如,使用React,您最终从主定义文件导入
Props
type,这使得它的可读性降低,而不是将类型串联起来。我想,这种方法对小型库可能很有用

2. 使用源文件。流后缀 使用这种方法,您基本上可以将所有未传输/未绑定的源代码与分发文件一起复制。这些文件将以
*.flow
扩展名结尾,这意味着flow将仅在类型分析时提取这些文件。阅读如何让它工作

简言之,你基本上:

  • 安装
    flow copy source
    作为开发人员依赖项
  • 将此添加到
    package.json

    "build:flow": "flow-copy-source -v -i '**/__tests__/**' src lib"
    
    其中,
    src
    是源代码的文件夹,
    lib
    是最终使用的分发文件的文件夹(可能在
    npm
    存储库中)

  • 有人可能会说,这种方法是“黑客式”的,会污染分发包。我同意,这不是很干净的解决方案,但可能是迄今为止我找到的最好的解决方案。请阅读提供的文章和评论,了解您还可以做些什么

    即将到来的变化(?) 我遇到了正在讨论这个确切问题的地方。似乎
    genflow文件
    即将被删除,我使用的方法是目前的前进方向