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

时间:2019-08-28 18:02:01

标签: javascript reactjs types flowtype

我正在写一个供第三方使用的库。我选择flowtype作为打字系统(由于我的组织而有特定原因)。该库公开了带注释的React组件。

使用流程类型对库进行注释。我还希望能够在具有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吗?这似乎很尴尬,因为现在我必须在两个位置(组件本身和流文件)维护类型。

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

1 个答案:

答案 0 :(得分:0)

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

1。公开单一定义文件

确保创建的定义文件与分发JS文件名相同。这意味着,如果您拥有带有捆绑文件lib-a的库lib-a.js,请命名定义文件lib-a.js.flow。按照creating library definitions上Flow文档中的介绍,正确定义模块。

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

我不喜欢这种方法,因为一切都需要放在一个地方。然后,在源代码中,您需要从定义文件中导入类型,以免最终避免重复类型定义。这不是很好,例如,在React中,您最终从主定义文件中导入了Props类型,这使它的可读性降低了,而不是直接插入类型。我猜这种方法对小型图书馆可能很好。

2。 使用源文件.flow后缀

使用这种方法,基本上可以将所有未编译/未捆绑的源代码复制到分发文件中。这些文件将以*.flow扩展名结尾,这意味着Flow只会将它们用于类型分析。阅读this article,了解如何使其正常工作。

简而言之,您基本上是:

  1. flow-copy-source安装为开发依赖项
  2. 将此添加到package.json

    "build:flow": "flow-copy-source -v -i '**/__tests__/**' src lib"
    

    其中src是源代码的文件夹,而lib是分发文件的文件夹,这些文件最终将被使用(可能在npm存储库中)。

一个人可能会说这种方法是“ hacky” ,并且污染了分发程序包。我同意,这不是很干净的解决方案,但可能是到目前为止找到的最好的解决方案。请阅读提供的文章和评论,以进一步了解您还可以做什么。

即将到来的变化(?)

我遇到this Github thread时,正在讨论这个确切的问题。看来gen-flow-files即将被删除,而我目前使用的方法是目前的前进方向。