在已有的代码上跑 Flow

提醒#

对原先没有使用类型注解的代码使用 Flow,需要花点时间,而且短期内体现不出什么价值。 Flow 支持 接口定义文件,所以你不一定要对已有模块进行 Flow 检测,你可以对已有模块定义类型,然后使用时就带有类型检测功能了。 如果你的项目依赖第三方库,请查看 指南 ,了解如何使用 Flow 配合第三方库,定义它们的接口文件。

为什么对现有代码作类型检测很难呢? 某些代码不带类型,通常是因为代码复杂、动态逻辑特别多,然后解析器无法很好理解、探测。 还有一些代码风格是 Flow 故意不建议的,是为了更好的帮助开发者,像下面这些典型例子:

  • primitive 值运算:js 允许这样运算,如 true + 3, 不过 Flow 认为这是个类型错误。 Flow 设计如此,希望开发者编写更安全的代码。 以后新添加的代码都能避开这种潜在危险了, 甚至有时候对已有代码过滤一下这类错误也是很有用的。

  • null 值:Flow 通过跟踪程序内 null 或者 undefined 的值,在你可能访问到 null 值的 属性时,给你提醒保护。虽然不是发生在运行时,但它依然能探测到,并且需要你在一些可能是 null 的地方加一些判断代码,保证安全。

为了让这些代码作类型检测,真的得花上更多的精力,而且要添加好多类型注解。 不过话说回来,如果你有一个库然后想相对它使用 Flow,这些指南是适合你的。

弱模式#

Flow 有一个特殊模式,叫 弱模式, 适合复杂项目开展前期,让你无须过早的付出太多时间。 弱模式和正常模式的区别在于 Flow 如何对待遗漏的类型注解。在正常模式下,Flow 对缺少 类型注解的地方探测类型,然后输出相应错误。但是在弱模式下,Flow 就不做那么多类型检测, 对方法内的类型还是会探测,但是对其他未注解的变量,会认为他们可以是 any 任何类型——也就意味着无须检测

对于一个现有的库来说,先用弱模式比较好,只需要修改注释为:

1
/* @flow weak */

弱模式依然会给出类型错误,不过可能给的更少,比较容易修复。 这能给你直接带来好处又无须太多工作。 通常给出的错误都是你想要的:

  • 潜在的 null 或者 undefined 问题, 加个条件判断就完了

  • primitive 类型错误:例如 true + 3. 需要一点语法知识解决,不过都是一些小改动

  • Flow 不懂你的代码,那就 注解为 any 任何类型, 让检测器更容易理解

通常,弱模式给出的错误数不多而且都好解决,然后你又能得到一定好处。

下一步#

一旦你使用弱模式检测,你可以着手添加逐渐添加类型注解。每增加一个类型注解,Flow 就能检测 更多的代码,你就能逐步的将 Flow 检测覆盖所有代码

随着你的类型注解逐渐完整,你可以考虑切换到正常模式,也就是改下注释。

1
/* @flow */

← Prev Next →

You can edit this page on GitHub and send us a pull request!