Flow类型检查在React项目中的应用
为什么需要引入类型检查?
JS作为一个弱类型语言,一个著名的黑点是它很容易就写出非常隐蔽的隐患代码,在编译期甚至运行时看上去都不会报错,但是可能会发生各种各样奇怪的和难以解决的bug。
所谓类型检查,就是在编译期尽早发现(由类型错误引起的)bug,又不影响代码运行(不需要运行时动态检查类型),使编写js具有和编写Java等强类型语言相近的体验。它可以:
1、使得大型项目可维护
2、增加代码的可读性
3、通常会有更好的IDE支持
什么是Flow
Flow是一个由Facebook出品的JavaScript静态类型检查工具,它与Typescript不同的是,它可以部分引入,不需要完全重构整个项目(需要进行类型检查的文件加上//@flow 注释),所以对于一个已有一定规模的项目来说,迁移成本更小,也更加可行。除此之外,Flow可以提供实时增量的反馈,通过运行Flow server不需要在每次更改项目的时候完全从头运行类型检查,提高运行效率
基本形式
// @flowfunction square(n:number):number{return n*n;
}square("2");
// Error!
安装与配置 安装
yarn add --dev flow-bin //最好安装项目文件.flowconfig中要求的版本
运行检查
yarn flow
安装flow-type(导入第三方类型的工具)
yarn add --dev flow-type
运行flow-typed
yarn flow-typed install module_name
webstorm中配置
文章图片
image 配置好之后在所有有//@flow注释的文件都会进行监视
.flowconfig修改 在[options]里加上
esproposal.decorators=ignore//忽略装饰符module.system.node.resolve_dirname=./src//允许在src里查找模块module.system.node.resolve_dirname=node_modules
在React的应用: 1、mobx的最佳实践
定义store: AppStore.js
//@flowimport { observable, action, runInAction, configure }from 'mobx'
class appStore {
@observable
isLoading: boolean =false@loading
@action
async login(user: {userName: string, password: string }) {
const {accessToken, userId } =await TokenAuthService.authenticate({
model: {
userNameOrEmailAddress: user.userName,
password: user.password
}
})await setStorageValue('Authorization', accessToken)
return userId
}
}export default appStore
使用Store: Login.js
//@flowimport React, {Component }from 'react'
import {StyleSheet, View }from 'react-native'
import type AppStore from '../../store/AppStore'type Props = {
appStore: AppStore
}class App extends Component {
render() {
//test
this.props.appStore.login({user:"userName",password:"123456"})
return (
)
}
}
这种使用方式可以使得在调用this.props.appStore.时,webstorm能知道appStore的所有属性和方法,从而自动给出提示
2、变量为第三方类型时
以react-navigation为例:
使用:
yarn flow-typed install react-navigation
自动生成flow-typed文件夹,在npm子文件夹里创建了一个类型文件react-navigation_v2.x.x.js,里面是react-navigation一些方法属性的声明,调用的时候:
import type {NavigationScreenProp} from 'react-navigation'
之后
type Props{
navigation :NavigationScreenProp<*>
}
调用
const {push}=this.props.navigationpush&&push('otherScreen')
【Flow类型检查在React项目中的应用】注意push(),pop()等等这些方法如果不写undefine判断,flow会报错,因为在type文件里这些方法是有加问号?的,表明可以为undefine,flow为了防止调用未定义的方法所以报错
推荐阅读
- mysql|InnoDB数据页结构
- 接口|axios接口报错-参数类型错误解决
- 带你了解类型系统以及flow和typescript的基本使用
- 3.css浮动
- 史前艺术的审美类型「清央美术」
- 年年体检,却查出癌晚期(漏掉这些检查,体检等于白查!)
- 为Google|为Google Cloud配置深度学习环境(CUDA、cuDNN、Tensorflow2、VScode远程ssh等)
- 认识图表
- MySQL|MySQL 5.7参考手册_11.1 数据类型概览
- 人的四种气质类型和四种血型性格辨析