赶个晚集!深入浅出 flow

一. 强类型和弱类型

强类型

强类型语言中不允许任意的隐式类型转换

弱类型

弱类型语言中允许任意的隐式类型转换

二. 静态类型与动态类型

静态类型

一个变量声明时他的类型就是明确的,声明过后,他的类型就不允许再次被修改

动态类型

运行阶段才能够明确的变量类型,而且变量的类型随时可以改变

三. flow

安装flow

js 复制代码
// 初始化项目包

yarn init

// 安装flow

yarn add flow-add --dev

基本使用

运行

js 复制代码
yarn flow

提示要求使用flow init来初始化flow,生成配置文件

js 复制代码
yarn flow init

生成.flowconfig文件

再次运行yarn flow, 提示错误

使用flow需要加入注释:// @flow

js 复制代码
// @flow



function sum(x: number, y: number){
    return x + y
}



sum(3, 4)

sum('2', '4')

flow编译移除注解

  • 使用flow-remove-types

安装

js 复制代码
yarn add flow-remove-types

运行

js 复制代码
// 编译到dist文件中,dist文件中为删除后的代码

yarn flow-remove-types . -d dist

// 或

yarn flow-remove-types src -d dist
  • 使用babel
js 复制代码
yarn add @babel/core @babel/cli @babel/preset-flow --dev

新建.babelrc

js 复制代码
{

    "presets": ["@babel/preset-flow"]

}

运行:

js 复制代码
// 将src中的文件代码编译到dist文件中

yarn babel src -d dist

开发工具插件

会直接在文件中显示代码波浪线,更直观的去处理异常。

类型推断

会根据传入与输出的值,自动的推断参数接受内容的异常。

类型注解

js 复制代码
// @flow

// 类型注解

// 为函数参数添加注解

function square(n: number){
    return n * n
}

// 为变量添加注解

let num: number = 100

// 对于没有返回值的函数,应当标记为:function foo(): void {}

function foo(): number {
    return 100
}

flow原始类型

js 复制代码
const a: string = 'burvs'
const b: number = Infinity // NaN 100
const c: boolean = false //true
const d: null = null

// undefined使用void表示
const e: void = undefined

const f: symbol = Symbol()

数组类型

js 复制代码
// 表示全部是数组组成的数组

const arr1: Array<number> = [1, 2, 3]

// 或

const arr2: number[] = [1, 2, 3]


// 指定具体值的类型

// 元组
const foo: [string, number] = ['foo', 100]

对象类型

js 复制代码
// 指定对象中值的具体类型

const obj1: { foo: string, bar: number } = { foo: 'burvs', bar: 100 }


// ?为可选值

const obj2: { foo?: string, bar: number } = { bar: 100 }


// 另一种方式

// [键对应的类型]:值对应的类型

const obj3: { [string]: string } = {}



obj3.key1 = 'value1'

obj3.key2 = 'value2'
#### 函数类型
js 复制代码
// 指定回调函数的参数以及返回值

// void表示无返回值
function foo(callback: (string, number) => void){
    callback('string', 100)
}


// 调用

foo(function(str, n){
    // str => string
    // n => number

})
#### flow特殊类型
js 复制代码
// 限制变量必须是某一个值

// 限制变量必须是字符串foo

const a: 'foo' = 'foo'

// 限制变量的值必须是以下三种之一
// 或类型
const type: 'success' | 'warning' | 'danger' = 'success'

// 限制b为string或者number类型
const b: string | number = 'burvs'

// 类型别名

type StringOrNumber = string | number
const c: StringOrNumber = 100

// maybe的类型(有可能)

// 除了接受number类型以外,还可以接受null或undefined
const gender: ?number = null

// 相当于
const gender: number | null | void = undefined
#### Mixed Any
js 复制代码
// mixed

function passMixed(value: mixed){}

// 可以接受任意类型

// string | number |boolean...
passMixed('string')
passMixed(100)
js 复制代码
// any

function passAny(value: any){}
// 可以接受任意类型
// string | number |boolean...
passAny('string')

passAny(100)

区别:

js 复制代码
// mixed为强类型,any为弱类型

function passMixed(value: mixed){
    // mixed需要进行类型判断
    if(typeof value === 'string'){
        value.substr(1)
    }

    if(typeof value === 'number'){
        value*value
    }
}


function passAny(value: any){
    // any在未明确参数类型的情况下仍然可以进行数据处理
    value.substr(1)
    value*value
}

推荐使用mixed,any更多为旧代码过度使用。

相关推荐
一丝晨光23 分钟前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
Front思25 分钟前
vue使用高德地图
javascript·vue.js·ecmascript
zqx_71 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架
惜.己1 小时前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
什么鬼昵称2 小时前
Pikachu-csrf-CSRF(get)
前端·csrf
长天一色2 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
NiNg_1_2342 小时前
npm、yarn、pnpm之间的区别
前端·npm·node.js
秋殇与星河2 小时前
CSS总结
前端·css
NiNg_1_2342 小时前
Vue3 Pinia持久化存储
开发语言·javascript·ecmascript
读心悦2 小时前
如何在 Axios 中封装事件中心EventEmitter
javascript·http