1 ) 概述
2 ) Why 使用
3 )Flow 的工作方式
npm i -g flow-bin
flow init
来创建[ignore]
[include]
[libs]
[lints]
[options]
[strict]
/*@flow*/
function split(str) {
return str.split(' ')
}
split(11)
flow
,可见报错/*@flow*/
function add(x, y){
return x + y
}
add('Hello', 11)
1 )number类型
/*@flow*/
function add(x: number, y: number): number {
return x + y
}
add('Hello', 11)
2 )数组类型
/*@flow*/
var arr: Array<number> = [1, 2, 3]
arr.push('Hello')
3 ) 类和对象
/*@flow*/
class Bar {
x: string; // x 是字符串
y: string | number | void; // y 可以是字符串或者数字或者不传
z: boolean;
constructor(x: string, y: string | number | void) {
this.x = x
this.y = y
this.z = false
}
}
// var bar: Bar = new Bar('hello') // 这里y是void不传 也可
var bar: Bar = new Bar('hello', 4)
var obj: { a: string, b: number, c: Array<string>, d: Bar } = {
a: 'hello',
b: 11,
c: ['hello', 'world'],
d: new Bar('hello', 3)
}
4 ) Null
/*@flow*/
var foo: ?string = null
5 )特殊类型
const a:'foo' = 'foo' // 字面量类型
const b: 'success'|'warnning'|'danger' = 'success'; // 联合指定类型
const c:string | number = 1 // 指定多个简单类型 或者等于一个字符串
const d: {foo: string, bar: number } = {foo: 'foo', bar: 100 } // 指定引用类型
// mixed 类型 所有类型的联合类型 是一个具体类型 编译阶段会检查 强类型,内部调用需要判断类型才能调用具体类型的方法
function e(value:mixed) {}
e('a')
e(1)
// any类型 接受所有类型 弱类型 编译阶段不会检查
function f(value: any) {}
f('a')
f(1)
6 ) 第三方库的使用
npm install -g flow-typed
安装flow-typed
仓库
flow-typed install
来检查 package.json文件npm run flow
,就会发现没有错误了7 )移除类型注释
7.1 使用 flow-remove-types 工具
额外添加的类型注释不是正确的JavaScript语法,打包编译的时候需要在源码中移除
可以通过flow-remove-types
来剔除,或者如果你已经用Babel来转译JS
你可以使用Babel preset来移除。我们只讨论第一种方法
首先需要安装 flow-remove-types
作为项目依赖库
npm install --save-dev flow-remove-types
之后,在package.json文件中添加另一个 script 入口
"scripts": {
"flow": "flow",
"build": "flow-remove-types src/ -d dist/"
}
运行npm run build将剔除src文件夹下的所有类型注释,在dist文件夹中保存编译后的版本
编译后的文件就是普通的能运行于浏览器的JavaScript文件
7.2 使用 babel-preset-flow
flow
├── compiler.js # 编译相关
├── component.js # 组件数据结构
├── global-api.js # Global API 结构
├── modules.js # 第三方库定义
├── options.js # 选项相关
├── ssr.js # 服务端渲染相关
├── vnode.js # 虚拟 node 相关