flow类型检查

数字鎏金渡
• 阅读 2086

学习目的

  • 减少隐晦的 bug,让代码更加符合预期
  • 轻量级的js类型检测,能快速上手和应用

安装

1.需要安装babel来转义flow 语法
1. yarn add --dev @babel/core @babel/cli @babel/preset-flow

2.在根目录创建.babelrc文件 设置内容

{
  "presets": ["@babel/preset-flow"]
}
2.安装flow
yarn add --dev flow-bin
3.启动flow后台服务

flow

// 暂停 flow stop
4.初始化项目

flow init
5.在需要执行类型检测的js文件顶部加入// @flow
// @flow

function foo(x: ?number): string {
  if (x) {
    return x;
  }
  return "default string";
}

部分语法

支持7中数据类型的检测

BooleanNUllUndefinedNumberStringObjectSymbol

注意大小写

// 案例1
// @flow

function check(x: number, y: string, z: boolean) {
//...
}

method(1, "test", true)

// 案例2

// @flow
function method(x: Number, y: String, z: Boolean) {
  // ...
}

method(new Number(1), new String("test"), new Boolean(true))

以上案例区分大小写,小写的 number 是原始类型,而大写的 Number 是JavaScript的构造函数,是对象类型的

可选类型

// @flow
function acceptsMaybeString(value: ?string) {
  // ...
}

acceptsMaybeString("bar");     // Works!
acceptsMaybeString(undefined); // Works!
acceptsMaybeString(null);      // Works!
acceptsMaybeString();          // Works!
可选对象属性
{ propertyName?: string } 
// 和ts类似
可选的函数参数
// @flow
function func(value?: string) {
  // ...
}
// @flow
function acceptsObject(value: { foo?: string }) {
  // ...
}
acceptsObject({ foo: "bar" }); // Works!
acceptsObject({ foo: undefined }); // Works!
acceptsObject({ foo: null }); // Error!
acceptsObject({}); // Works!
文字类型
function foo(value: 2) {}

foo(2); // Work!
foo(3); // Error!
foo('2'); // Error!
混合类型
// @flow
function stringify(value: mixed) {
  // $ExpectError
  return "" + value; // Error!
}

stringify("foo");
另外还有 数组类型:Array; 接口类型:interface;任意类型:any

类型注解

并非什么情况下都需要 将类型写的注解的很详细

比如

/* @flow */
function add(num1, num2) {
  return num1 + num2;
}
var x = add(3, '0');
console.log(x);

这种情况,flow也是会起检测作用,非强校验

第三方库

.flowconfig 中增加
[libs]
interfaces/
需要在interfaces目录下面为第三方库写一些接口定义
// flow会检查 interfaces 下 所有的js文件

// 例如Underscore

declare class Underscore {
  findWhere<T>(list: Array<T>, properties: {}): T;
}

declare var _: Underscore;

// 不然引用的时候会报错
// underscore_example.js:11:10,10: unknown global name: _

.flowconfig其他配置

[include] 指定需要检查的目录或者文件

[include]
../externalFile.js
../externalDir/
../otherProject/*.js
../otherProject/**/coolStuff/
[ignore] 忽略文件或者文件夹
.*/__tests__/.*
.*/src/\(foo\|bar\)/.*
.*\.ignore\.js

注意
[ignore] 在 [include] 之后, 如果同时 include 和 ignore 同个路径,那么就会 ignore

参考:

【1】https://zhenyong.github.io/fl...

【官网】https://flow.org/en/docs/

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
typeScript数据类型
//布尔类型letisDone:booleanfalse;//数字类型所有数字都是浮点数numberletdecLiteral:number6;lethexLiteral:number0xf00d;letbinaryLiteral:number0b101
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
数字鎏金渡
数字鎏金渡
Lv1
于过往岁月里,见过朝阳初升。
文章
3
粉丝
0
获赞
0