JS静态类型检查工具Flow使用指南
TypeScript最近大火,很多人在说它与JavaScript不同之处,其中有一点必提的就是类型检查。如果我不想用TS写代码,还想对原生的JavaScript做类型检查,有没有这样的工具包呢?
FLow:https://flow.org/en/
Flow是由 facebook 开发的 JavaScript 静态类型检查工具。下面举几个例子,看看怎么使用。
安装使用
- npm init 生成 package.json
- npm install --save-dev @babel/core @babel/cli @babel/preset-flow
- 创建.babelrc,配置
{
"presets": ["@babel/preset-flow"]
}
- npm install --save-dev flow-bin
- 在package.json中的脚本中添加
"scripts": {
"flow":"flow",
}
- npm run flow init 初始化flow,生成.flowconfig
- 创建测试文件 test-flow.js,添加代码
function foo(x: ?number): number {
if (x) {
return x;
}
return 0;
}foo('hi')
- 运行 npm run flow
![JS静态类型检查工具Flow使用指南](https://img.it610.com/image/info10/430756e48ec048ad9aea31ca33c6bfcb.jpg)
文章图片
image.png 类型检查成功!
几个例子
- 混合类型的检查
function foo(value: string | number) {
return '' + value;
}foo(123) // Works!
foo('hi') // Works!
foo(true) // Error!
- 可选类型
// @flow
function foo(value: ?number) {
// ...
}foo(42);
// Works!
foo();
// Works!
foo(undefined);
// Works!
foo(null);
// Works!
foo("42");
// Error!
如果你的参数是一个对象,没有属性key,应该怎么合理检查呢?
// @flow
function foo({ value }: { value?: ?number }) {
// ...
}foo({ value: undefined });
// Works!
foo({});
// Works!
- 类检查
// @flowclass Bar {
x: string;
y: string | number;
z: boolean;
constructor(x: string, y: string | number) {
this.x = x
this.y = y
this.z = false
}
}var bar: Bar = new Bar('hello', 4)
- 自定义类型检查
为了解决这类问题,Flow 提出了一个 libdef 的概念,可以用来识别这些第三方库或者是自定义类型。在.flowconfig 的 [libs] 部分用来描述包含指定库定义的目录。
Vue 就是采用 Flow 进行静态类型检查的,在源码目录下可以看到一个 .flowconfig 文件,[libs] 指向 flow 文件夹,打开文件夹,文件结构是:
flow
├── compiler.js# 编译
├── component.js# 组件
├── global-api.js# Global API
├── modules.js# 第三方库
├── options.js# 选项
├── ssr.js# 服务端渲染
├── vnode.js# 虚拟 node
├── weex.js# weex
【JS静态类型检查工具Flow使用指南】可以看到,Vue.js 有很多自定义类型的定义。
推荐阅读
- mysql|InnoDB数据页结构
- 接口|axios接口报错-参数类型错误解决
- iOS,打Framework静态库
- java静态代理模式
- 带你了解类型系统以及flow和typescript的基本使用
- Android|Android JNI之静态注册(android studio)
- 史前艺术的审美类型「清央美术」
- 年年体检,却查出癌晚期(漏掉这些检查,体检等于白查!)
- 认识图表
- MySQL|MySQL 5.7参考手册_11.1 数据类型概览