Flow

97 阅读2分钟

image.png

javascript

  • 是一门弱类型,而且是动态类型的语言

1.相关概念

  • 静态类型:一个变量在声明时类型就是明确的,声明之后就不允许再修改
  • 动态类型:在运行阶段才能够明确变量的类型,变量的类型可以随时变化
  • 强类型:不允许任意的数据隐式类型转换
  • 弱类型:允许任意的数据隐式类型转换

2.强类型语言优点

  • 错误更早暴露
  • 代码更智能,编码更准确(IDE提示更准确)
  • 重构更牢靠
  • 减少不必要的类型判断

Flow

  • javascript类型检查器,是一个小工具
  • 类型注解
// @flow

function sum (a: number, b: number) {
  return a + b
}

sum(100, 100)
sum('100', '100')
  • 类型推断
// @flow
function square (n) {
  return n * n
}

square('100')
  • 函数返回值
function foo (): number {
  return 100 // ok
  // return 'string' // error
}

function bar (): void {
  // return undefined
}
  • 原始类型
const a: string = 'foobar'

const b: number = Infinity // NaN // 100

const c: boolean = false // true

const d: null = null

const e: void = undefined  // 注意unfined不一样

const f: symbol = Symbol()
  • 数组类型
const arr1: Array<number> = [1, 2, 3]

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

// 元组
const foo: [string, number] = ['foo', 100]
  • 对象类型
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'
  • 函数类型
function foo (callback: (string, number) => void) {
  callback('string', 100)
}

foo(function (str, n) {
  // str => string
  // n => number
})
  • 特殊类型
// 字面量类型
const a: 'foo' = 'foo'
const type: 'success' | 'warning' | 'danger' = 'success'

// 声明类型
type StringOrNumber = string | number
const b: StringOrNumber = 'string' // 100

// Maybe 类型
const gender: ?number = undefined
// 相当于
// const gender: number | null | void = undefined
  • Mixed和any
// Mixed强类型
// 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 弱类型,兼容老的项目

function passAny (value: any) {
  value.substr(1)   // 类型是字符串
  value * value   // 类型是数字
}

passAny('string')
passAny(100)