如何使用Flow
初始化 yarn init —yes
安装 yarn add flow-bin —dev (这是是局部安装的)
在flow的 bin下 找到 flow 可执行文件
使用了flow 就不需要 vscode的js 语法校验了
关闭 vscode 语法校验:打开 设置 搜索 javascript validate 关闭
使用flow
需要在 使用 flow的 文件内 添加 // @flow 的标记
此时yarn flow 会报错 因为没有初始化
初始化 yarn flow init
再次 使用 yarn flow 就ok了
完成后 可以使用 yarn flow stop 命令 结束服务
测试代码_
// @flow
function sum (a: number, b: number) {
return a + b
}
sum(100, 100)
// 使用flow 找到了 类型使用上的问题
// sum('100', '100')
// sum('100', 100)
运行时发现 我们无法通过node 直接运行
因为 运行时必须要 去掉类型注解
我们需要安装模块来 进行操作
方式1:
可以通过 flow-remove-types 模块 来去除类型注释
安装 —— yarn add flow-remove-types —dev
执行 ——- yarn flow-remove-types {当前目录} -d {输出目录}
如: yarn flow-remove-types . -d dist
可以在 dist 中 找到 我们编译的文件
方式2:
也可以安装 babel 来进行
安装 先安装@babel/core 核心模块
安装 @babel/cli 工具 可以在命令行直接使用 babel命令完成编译
安装 @babel/perset-flow 包含了转换flow 类型注解的插件
先在项目中 添加一个 babel的配置文件 .babelrc
babelrc中 添加presets 这里的 presets 就是我们刚刚添加的 @babel/preset-flow
插件:
开发工具插件 Flow Language Support
可以直接显示出来 当前的类型问题
必须保存过后才会重新检测
类型推断
/**
* 类型推断
*
* @flow
*/
function square (n) {
return n * n
}
// 传入非数字参数 flow 仍然可以发现 类型错误 ----类型推断
// 尽可能 为代码中的成员去添加 类型注解 有更好的可读性
// square('100')
square(100)
// square('100') 此处报错
类型注解
/**
* 类型注解
*
* @flow
*/
// 参数应用
function square (n: number) {
return n * n
}
// 变量名上应用
let num: number = 100
// num = 'string' // error
// 返回值应用
function foo (): number {
return 100 // ok
// return 'string' // error
}
// 没有返回值 默认返回 undefined
function bar (): void {
// return undefined
}
原始类型
/**
* 原始类型
*
* @flow
*/
const a: string = 'foobar'
// Infinity 无穷大
const b: number = Infinity // NaN // 100
const c: boolean = false // true
const d: null = null
// flow 中 undefined 用 void 标记的
const e: void = undefined
const f: symbol = Symbol()
数组类型
/**
* 数组类型
*
* @flow
*/
const arr1: Array<number> = [1, 2, 3]
const arr2: number[] = [1, 2, 3]
// 元组 固定长度的数组
const foo: [string, number] = ['foo', 100]
对象类型
/**
* 对象类型
*
* @flow
*/
// 此对象必须具有foo和bar 两个成员 而且类型必须匹配
const obj1: { foo: string, bar: number } = { foo: 'string', bar: 100 }
// ?代表可选
const obj2: { foo?: string, bar: number } = { bar: 100 }
// 指定键值的类型
const obj3: { [string]: string } = {}
obj3.key1 = 'value1'
obj3.key2 = 'value2'
函数类型
/**
* 函数类型
*
* @flow
*/
// 设置回调函数返回值 及参数
function foo (callback: (string, number) => void) {
callback('string', 100)
}
foo(function (str, n) {
// str => string
// n => number
// 不可有返回值 或者返回 undefined
})
特殊类型
/**
* 特殊类型
*
* @flow
*/
// 字面量类型
// 限制变量必须是某一个值
const a: 'foo' = 'foo'
// 联合类型 或类型
const type: 'success' | 'warning' | 'danger' = 'success'
// ------------------------
// 声明类型
type StringOrNumber = string | number
const b: StringOrNumber = 'string' // 100
// ------------------------
// Maybe 类型
const gender: ?number = undefined
// 相当于
// const gender: number | null | void = undefined
Mixed/Any
/**
* Mixed Any
*
* @flow
*/
// string | number | boolean | .... 可以是任何类型
function passMixed (value: mixed) {
// 需要加判断 不然会报语法错误
if (typeof value === 'string') {
value.substr(1)
}
if (typeof value === 'number') {
value * value
}
}
passMixed('string')
passMixed(100)
// ---------------------------------
// any 也可以传入任意类型的参数
// any 弱类型 mixed 强类型
function passAny (value: any) {
value.substr(1)
value * value
}
passAny('string')
passAny(100)
// 第三方 flow 文档
// https://www.saltycrane.com/cheat-sheets/flow-type/latest/