如何使用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 命令 结束服务
测试代码_
// @flowfunction 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}// 没有返回值 默认返回 undefinedfunction bar (): void {// return undefined}
原始类型
/*** 原始类型** @flow*/const a: string = 'foobar'// Infinity 无穷大const b: number = Infinity // NaN // 100const c: boolean = false // trueconst d: null = null// flow 中 undefined 用 void 标记的const e: void = undefinedconst 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 | numberconst 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/
