跳至主要内容

Flow 注解导出

升级到 类型优先 模式可能需要在模块边界添加大量类型注解。为了帮助升级大型代码库,我们提供了一个代码重构命令,其目标是填充这些缺失的注解。此命令包含在 Flow 二进制文件中,版本 >= 0.125

注意:从 0.134 版本开始,类型优先是默认模式。如果您使用的是 >=0.134 版本,请确保在运行此代码重构时在您的 .flowconfig 中设置 types_first=false

此命令使用 Flow 推断的类型来填充原本会引发 签名验证 失败的位置。它将包含必要的类型导入语句,只要相应的类型从其定义模块导出。

它旨在用于一次处理多个文件,而不是一次处理一个文件。因此,它不会连接到现有的 Flow 服务器,而是启动自己的检查过程。

与这种机械化方法一样,它也有一些注意事项

  1. 它无法填充所有必需的类型注解。某些情况需要手动操作。
  2. 插入的注解可能会导致新的 Flow 错误,因为无法始终将推断的类型与可以作为注解编写的类型匹配。
  3. 文件格式可能会受到影响。如果使用代码格式化程序(例如 prettier),建议您在代码重构运行完毕后运行它。

如何应用代码重构

调用此命令的典型方法是

flow codemod annotate-exports \
--write \
--repeat \
--log-level info \
/path/to/folder \
2> out.log

此命令将转换 /path/to/folder 下的文件。它不需要是根目录(包含 .flowconfig 的目录)。

它使用以下标志

  • --write 将就地更新 /path/to/folder 下需要注解的文件。如果没有此标志,生成的将文件会在命令行上打印。

  • --repeat 确保转换将被应用,直到不再有文件更改。此模式在这里是必要的,因为代码重构添加的每个新类型都可能需要新的位置进行注解。

  • --log-level info 在标准错误流中输出有用的调试信息。此选项可能会导致输出冗长,因此我们将错误输出重定向到日志文件 out.log

另一种提供输入的便捷方法是传递标志

--input-file file.txt

其中 file.txt 包含要转换的特定文件列表。

代码重构输出

在每次代码重构迭代之后,将在 CLI 上打印一个摘要。此摘要包含有关添加的注解数量以及跳过的位置数量的统计信息。它还打印遇到各种错误类型的计数。这些可以与日志中打印的错误匹配。

一个常见的错误情况是,在文件 a.js 中定义但未导出的类型 A 在文件 b.js 中被推断出来。代码重构将跳过添加此注解并在日志中报告错误。要解决此情况,您可以在 a.js 中导出 A。请注意,您无需在 b.js 中手动导入 A。代码重构将自动执行此操作。