快速上手 Flow 静态类型检查器
why Flow
javascript是一个弱类型语言,变量类型不需要声明,运算过程中会根据需要自动转换类型,这个是js的优点,够灵活,编码简单,但是同时也是软肋。有时候,有些类型转换的bug无从查起,特别是在复杂的应用中。
Flow为Javascript添加了静态类型检查,以提高开发效率和代码质量。更明确的说,静态类型检查提供的好处像早期错误检查,帮助你发现一些只有在运行时才能发现的错误。
安装
由于flow是用OCaml语言写的,npm上只有对应的二进制包。
npm install flow-bin
可者使用 Homebrew 安装
brew install flow
快速上手
在项目目录下执行 flow init
,会生成一个 .flowconfig
文件
只需要在待检查的js文件头部添加一行注释
/* @flow */
然后在同一目录下运行flow check
即可。
flow server
flow server是为了提高检测效率的后台程序,支持在后台运行,并且只监测有修改的文件。
方法很简单,一条 flow 命令就能完成 Flow 服务器启动,文件检测,被更改文件的检测,即第一次使用 flow 命令会启动 Flow 服务器并且首次检测文件,再次使用 flow 命令会连接 Flow 服务器并且检测文件,之后使用 flow 命令时将会连接 Flow 服务器并且对修改过的文件进行检测。
- flow check:检测所有声明了 @flow 的文件
- flow check –all:可以让Flow检测所有文件,包括没有声明 @flow 的文件
- flow stop:项目开发完成停止服务
flowconfig
- [ignore]忽略的文件,路径的匹配规则是正则表达式
- [include]需要检测的其他目录的文件
- [libs]当文件中有第三方库引用或者require全局的module时,需要在一个单独的文件里declare这个对象,这个的值是所有declare路径的集合
- [options]包含若干key-value的配置
flow的两种模式
/* @flow */ 只要带有这个注释,都会进行类型检测
/* @flow weak */ 只对有加类型声明的变量进行类型检测
类型声明/标注
不声明变量类型的时候,Flow 也会自动检查隐性存在的类型转换。但更为严谨的方式是显式声明变量的类型。
可以在代码里写上类型:
/* @flow */
// Changing the return type to number fixes the error
function foo(x: string, y: number): number {
return x.length * y;
}
foo('Hello', 42);
也可以这样:
/* @flow */
type T = number;
var x: T = 0;
下面是一个更详细的例子:
class People {
name: string;
constructor(name:string){
this.name = name
}
getAge():number{
return 18;
}
}
function getLength(param?:string):number {
/*param?:string传参类型什么,?表示此处可不传值;*/
/*\:number为函数返回值类型,如果没有return可不写或写void*/
var s:string = 'string';/*字符*/
var ss:String = new String('string');/*字符对象*/
/* s = ss*///类型不同,flow会报错
var n:number = 12;/*数字*/
var nn:Number = new Number(12);/*数字对象*/
var b:boolean = true;/*bool值,仅能为true/false*/
var bb:Boolean = new Boolean(true);/*bool值对象*/
var o:{prop1:number,prop2:string} = {
/*对象熟悉声明*/
prop1: 12,
prop2: '21123'
}
var v:void = undefined;/*undefined*/
var a:any = 'aa';/*任意类型,除undefined*/
var m:mixed = '1';/*任意类型+undefined*/
var mm:mixed = undefined;/*任意类型+undefined*/
var aa:Array = [1,2,3,4];/*数组内值类型声明*/
var P:Class = People;/*自定义类型声明*/
var p:People = new People('pt');/*自定义People类型*/
if (param) {
return param.length;
} else {
return 0;
}
}
兼容性
Flow致力于支持最新的JavaScript标准。目前已经支持各种ES6特性如destructuring, classes, extended objects, optional function parameters,以及核心API扩展(比如Map, Set, Promise, 和 new methods on Object, Array, 和 Math)。其它特性(尤其是模块)正在开发中。Flow支持CommonJS / Node.js 规范的模块。
Flow 也已经支持 React。
代码编译
在构建工具中添加flow检查的步骤。webpack和gulp都有对应的flow插件。
我们在项目中用到的插件: eslint-plugin-flow-vars
参考
Flow官网最近访问不了,可以看这里:https://github.com/facebook/flow/tree/master/website/docs flow——A static type checker for javascript #32 flow–facebook出品的javascript静态类型检查器