我正在写一个供第三方使用的库。我选择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
,因此可以识别出该组件具有道具,状态等的特定类型,但是没有。
答案 0 :(得分:0)
因此,经过一些研究,我得出结论,有两种方法:
确保创建的定义文件与分发JS文件名相同。这意味着,如果您拥有带有捆绑文件lib-a
的库lib-a.js
,请命名定义文件lib-a.js.flow
。按照creating library definitions上Flow文档中的介绍,正确定义模块。
使用这种方法,您需要在其中声明整个模块。这意味着,如果您有类MyComponent
,则需要在此处再次定义它。
我不喜欢这种方法,因为一切都需要放在一个地方。然后,在源代码中,您需要从定义文件中导入类型,以免最终避免重复类型定义。这不是很好,例如,在React中,您最终从主定义文件中导入了Props
类型,这使它的可读性降低了,而不是直接插入类型。我猜这种方法对小型图书馆可能很好。
使用这种方法,基本上可以将所有未编译/未捆绑的源代码复制到分发文件中。这些文件将以*.flow
扩展名结尾,这意味着Flow只会将它们用于类型分析。阅读this article,了解如何使其正常工作。
简而言之,您基本上是:
flow-copy-source
安装为开发依赖项将此添加到package.json
:
"build:flow": "flow-copy-source -v -i '**/__tests__/**' src lib"
其中src
是源代码的文件夹,而lib
是分发文件的文件夹,这些文件最终将被使用(可能在npm
存储库中)。
一个人可能会说这种方法是“ hacky” ,并且污染了分发程序包。我同意,这不是很干净的解决方案,但可能是到目前为止找到的最好的解决方案。请阅读提供的文章和评论,以进一步了解您还可以做什么。
我遇到this Github thread时,正在讨论这个确切的问题。看来gen-flow-files
即将被删除,而我目前使用的方法是目前的前进方向。