Flow: Facebook 出品的 JavaScript 静态类型检查工具

  • 李士窑

2014 年 11 月 25 日

话题:JavaScriptFacebook语言 & 开发架构

Flow是 Facebook 出品的一个 JavaScript 代码的静态类型检查工具,该工具采用开放源码的OCaml(Objective Caml)语言开发, 并遵守BSD 开源协议发布,其代码托管在GitHub上。Flow 能够帮助开发人员查找出 JavaScript 代码中的类型错误,从而提高开发效率和代码质量。Flow 已经能够捕获 JavaScript 代码中的常见问题,如静态类型转换不匹配、空指针引用等问题。同时,Flow 还为 JavaScript 新增了类型语法,如类型别名。当前,Flow 已具有以下两个主要特征:

1、 Flow 的类型检查具有可选性和自动性

通过使用 Flow,开发者能够有针对性地对文件进行检查,当开发者选择一个文件进行检查时,Flow 会自动检查相应代码,并报告检查出的错误。但是,对于比较大的 lib 一类文件,Flow 的检查报告有时候会不太精确,不过开发者可以使用“类型注释”人为干预 Flow 来进行类型检查或者将 Flow 切换到一种“弱模式”下以提高精确度。

2、Flow 的类型检查是一种及时、在线的检查

当对整个代码库进行检查时,Flow 首先会对整个代码库的所有文件进行一个初步地分析,然后监控文件的后续变化,并进行类型检查和依赖检查。对于开发者来说,他们根本感觉不出编译时间的延迟。当对代码进行编辑或者批量更新一批文件时,Flow 将会自动触发代码检查,并保存检查的结果以备及时查询使用。

目前,Flow 还处在早期阶段,仅支持 Mac OS X、Linux (64-bit) 两种系统。但是,Flow 开发团队正在进行快速的迭代开发,新功能将很快在接下来的版本中出现,如支持 JavaScript 的新标准 ECMAScript 6、使用js_of_ocaml编译器将 Flow 编译成 JavaScript 代码、为编集成 Flow、错误信息的分类和文件的过滤以及改进错误提示以做到能够更好的错误原因提示和错误定位等。Flow 已经在 Facebook 相关项目中使用,Facebook 开发团队期待着大家加入到该项目中,并给予宝贵的意见和建议。

Flow 类型检查的一个简单实例如下:

/* @flow */
function foo(x) {
  return x * 10;
}
foo(‘Hello, world!');

运行如下命令:

$> flow

将会给出在某行代码出现类型不兼容的提示,并指明应该是什么类型以及实际是什么类型。

Flow 官方还提供了使用入门指南,以供大家学习和研究,该指南包括如何在已存在的代码中运行 Flow、如何检查第三方代码、如何运行 Flow 的代码、如何排除问题排除以及代码检查的实例等内容。Flow 是个开放源码的项目,所以有兴趣的用户都可以从 GitHub 库下载其源码并进行深一步的研究。Flow 基于高性能的 OCaml 语言的实现,而 OCaml 是由Xavier LeroyDamien Doligez等人于 1996 年基于函数式编程语言Caml创立的一个开源项目,并在面向对象方面做了扩展。另外,除了 Flow 外,还有前端领域的大牛Douglas Crockford编写的 JavaScript 静态类型检查工具JSLint以及 JSLint 的一个分支——开源项目JSHint等。


感谢郭蕾对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

JavaScriptFacebook语言 & 开发架构