• 解决JavaScript自由类型的不足
    • 强类型与弱类型(类型安全)
      • 强类型 语言层面限制实参类型与形参类型必须相同
        • 有更强的类型约束
        • 不允许任意的数据隐式类型转换
        • 编译阶段就会报类型错误
      • 弱类型 在语言层面不会限制实参类型
        • 几乎没有类型约束
        • 允许任意的数据隐式类型转换
        • 在运行的时候代码判断
    • 静态类型与动态类型(类型检查)
      • 静态类型
        • 一个变量声明时它的类型就是确定的,不允许修改
        • 变量有类型
      • 动态类型
        • 在运行阶段才明确一个变量的类型,变量的类型也可以变化
        • 变量是没有类型的,变量中存放的值有类型
    • JavaScript 弱类型 且 动态类型
      • 任性,几乎没有任何类型限制
      • 缺失了类型系统的可靠性
      • 为什么不设计类型系统、
        • 早期的JavaScript应用简单
        • 脚本语言,不需要编译。没有编译环节
    • 弱类型的问题
      • 在执行的时候才会知道错误。隐患
      • 类型不确定 函数方法可能会带来期望外的结果
      • 用索引器给对象加属性,会自动转为字符串
    • 强类型的优势
      • 错误更早的暴露 在编码阶段语言本身就会报错
      • 代码更智能,编码更准确
      • 重构会更加牢靠 一旦对象属性名变化,编译阶段可以定位使用到此属性的 位置错误。
      • 减少不必要的类型判断
    • Flow

      • JavaScript 的类型检查器 可以弥补一些JavaScript 弱类型带来的弊端。
      • 在代码当初通过添加类型注解的方式表明参数变量的类型
        • function sum (a:number,b:number) :+类型 就是类型注解
        • 在生产环境会去掉。。
        • 不必为每一个变量加注
          1. 1.下载flow
          2. 2.初始化flow配置文件
          3. 3.flow检测的文件 添加 //@flow
          4. 4.在代码加上类型检测
          5. 5.启动flow
    • Flow 编译移除注解

      • 1.官方工具 flow-remove-types
      • 2.@babel/core @babel/cli @babel/preset-flow
    • Flow开发工具插件
      • Flow Language Support
    • Flow类型判断
      • 根据代码使用去推断类型
    • Flow类型注解 ```javascript let num:number = 100 function foo():number{} //返回值类型 函数没有返回值 默认返回undefined 返回值类型标记为:void
    1. - Flow原始类型
    2. - js原始数据类型 string boolern number(存放NaNinfinity null symbol 存放undefinedvoid
    3. - Flow数组类型
    4. - 1.Array 需要泛型参数<number>
    5. - 2.array:number[] = [1,2,3]
    6. - 元组 :[string,number] 固定长度的数组
    7. - Flow对象类型
    8. ```javascript
    9. const obj1:{foo:string,bar:number} ={
    10. foo:'nihao',
    11. bar:100
    12. }//必须foo ,bar 加?可有可无
    13. //动态限制
    14. const obj:{[string]:string} = {}
    • Flow函数类型
      • 限制存放函数类型 ```javascript function foo(callback:(string,number)=>void){ callback(‘string’,100) } foo(function(str,n){

    })

    1. - Flow特殊类型
    2. - 字面量类型
    3. ```javascript
    4. const a:'foo' = 'f00' //a只能是'foo'
    5. 一般联合使用 a |b |c
    6. type StringOrNumber = string |number //type声明一个类型
    7. //Maybe类型
    8. const gender:?number = null //在类型前加? 相当于扩展了 null 和undefined
    • Mixed 和 Any
      • Mixed 所有类型的联合
      • Any 也是
      • 区别mixed内部也是强类型 会验证类型 和any内部是弱类型主要是兼容性
    • Flow运行环境api
      • 会提供浏览器Api类型限制 比如getElementById 必须是字符串