热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:进阶学习12:Flow——JavaScript的类型检查器(安装&使用Flow详解)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了进阶学习12:Flow——JavaScript的类型检查器(安装&使用Flow详解)相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了进阶学习12:Flow——Javascript的类型检查器(安装&使用Flow详解)相关的知识,希望对你有一定的参考价值。






目录

一、概述

二、安装

三、使用

1.运行方式

2.编译移除注解

1.官方的 flow-remove-types

2.使用Bable配合插件

3.开发工具插件

四、Flow特性

1.类型推断

2.类型注释

3.Flow支持的数据类型

1.原始类型

2.数组类型

3.对象类型

4.函数类型

5.特殊类型

6.Mixed 与 Any

 7.类型小结

4.运行环境API




一、概述

Flow是一款Javascript的静态类型检查器,是2014年Facebook推出的一款工具,可以弥补Javascript带来的弊端,在React和Vue.js里面都有使用。在代码中,添加类型注解来判断是什么类型的。

像下面例子中,n: number这样的写法,就叫做类型注解

function square (n: number) {
return n * n
}
console.log(square('100'))

Flow不要求我们给每个变量都添加类型注解,我们在需要的地方添加就可以了。



Flow官网


https://flow.org/



二、安装

我个人用的是npm安装的,这边只摘录npm安装的步骤,

1.Terminal输入:

npm install --save-dev @babel/core @babel/cli @babel/preset-flow

2.然后创建一个 .babelrc 文件,需要和你项目的"@babel/preset-flow" 在同一根目录下

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

 3.Terminal运行:

npm install --save-dev flow-bin

4.在你的package.json文件中添加下面内容,如果没有package.json文件的话就自己创建一个。

{
"name": "my-flow-project",
"version": "1.0.0",
"devDependencies": {
"flow-bin": "^0.152.0"
},
"scripts": {
"flow": "flow"
}
}

三、使用

官方的安装文档,我后面只选择里npm部分展开



Installation | Flow


https://flow.org/en/docs/install/


 


1.运行方式

.第一次运行的时候输入:

npm run flow init

下面这样就是初始化成功了 

初始化成功以后运行:

npm run flow

创建一个新的js文件,输入下面文字。需要注意的是,我们使用flow的话,需在文件最开头的地方,添加// @flow字样。

// @flow
function sum(a,b) {
return a + b
}
sum(100,100)
sum('100','100')
function sum2(a:number,b:number) {
return a + b
}
sum2(100,100)
sum2('100','100')

有个小问题,在我们使用VSCode的时候,会发现使用flow的部分会提示错误。这是因为VSCode使用的是Javascript的语法校验,而这个不是JS的标准写法。所以我们需要自己手动关闭VSCode的语法校验。

关闭的方式:

搜索一下Javascript validate,把它关闭就ok了

这之后就不会报错了

然后执行

npm run flow check flow.js

可以看到如我们预期,在给定了类型之后输入错误类型的参数,能够提示错误。


2.编译移除注解

如果像平时一样直接运行我们上面的代码的话,是会报错的。毕竟类型注解不是JS的标准语法。

所以需要正常运行的话,还需要移除我们的类型注解,这个类型注解只是方便我们在编码的时候使用。

现在移除注解有两个比较主流的方案


1.官方的 flow-remove-types

官方文档如下.



flow-remove-types | Flow


https://flow.org/en/docs/tools/flow-remove-types/


我个人使用的是npm,根据官方文档

首先安装flow-remove-types

npm install --save-dev flow-remove-types

然后我将官网给出的下面这句yarn换成npm结合我文件位置使用

npm run flow-remove-types flow.js -d dist/test

但是报出了npm ERR! missing script: flow-remove-types的错误

我暂时也不知道为什么.尝试了输入下面的倒是运行成功,如果有好心人知道为什么的话求求留言告诉我一哈…

这个-d后面跟的是输出的文件夹。

./node_modules/.bin/flow-remove-types flow.js -d dist/test

输出的文件:


2.使用Bable配合插件

官方文档如下.



Babel | Flow


https://flow.org/en/docs/tools/babel/


 先输入这个来安装

npm install --save-dev @babel/preset-flow @babel/core @babel/cli

和上面遇到了相同的情况,只有这个麻烦的形式才能使用成功

./node_modules/.bin/babel flow.js -d dist

输出的文件,倒是要比使用flow-remove-types好看多了。


3.开发工具插件

现在检测到的问题都是输出到终端的,不是很方便。我们使用VSCode的话,可以安装相关插件更便于使用。

可以安装Flow Language Support,但是保存之后才会重新检测代码的问题。

不过我安装之后就不停报错,看了下报错内容only 7bit ascii allowed in…,想了想该不是因为我代码是放在中文名的文件下下面吧

路径的文件夹全部修改成英文之后,正常使用…泪目


四、Flow特性

1.类型推断

Flow当中除了使用成员注解去标注成员的类型,还可以很聪明的自动帮我们推断成员的类型。

比如下面这段代码,虽然我们没有使用注解,但是还是帮我们推断出来应该要使用number了。

function square(n){
return n * n
}
square('100')


2.类型注释

有以下两种写法

//变量后面冒号+类型的写法
let num: number = 100
//函数返回值的写法
function foo(): number {
return 100
}

如果类型不正确的话,会显示错误提示

如果函数本身没有返回值,默认的是返回undefined,所以也会报错

对于没有返回值的需要把类型写成void


3.Flow支持的数据类型


1.原始类型

也就是Javascript里面的几个基础类型。

const a: string = 'foobar'
const b: number = 100
const b1: number = NaN
const b2: number = Infinity
const c: boolean = true
const d: null = null
const e: undefined = undefined//X这行是会报错的
const e1: void = undefined//undefined 用void
const f: symbol = Symbol()

2.数组类型

下面是两种表示数组类型的方式

//表示数组类型的两种方法
//1.Array加尖括号
const arr1: Array = [1,2,3]
//2.类型加方括号
const arr2: number[] = [1,2,3]

表示固定长度的数组的方式(也就是元组):

//元组
//表示一个固定长度的数组,用一种类似数组自变量的方法表示
const foo: [string,number] = ['foo',100]

3.对象类型

Flow中描述对象的方式和对象自变量语法非常相似。

//对象
//花括号里面添加成员名称和类型限制
const obj1: { foo: string, bar: number} = {foo: ' string', bar:100}
//成员名称后面添加?,代表这个成员可有可无
const obj2: { foo?: string, bar: number} = {bar:100}
//当做键值对集合使用
const obj3: {[string]: string} = {}
obj3.key1 = 'values1'
obj3.key2 = 100 //X这行会报错

4.函数类型

对函数的类型限制,一般是说对函数的参数或者返回值进行约束。

这两种方式前面都已经提到过了,这边再展示一下相关代码。

//限制函数参数类型的写法
function sum2(a:number,b:number) {
return a + b
}
sum2(100,100)
//限制函数返回值类型的写法
function foo(): number {
return 100
}

此外,函数在JS中会被放到变量当中 ,那我们如何限制存放函数的数据类型,看下面例子。

function foo (callback:(string, number) => void){
callback('string', 100)
}
//调用
//参数必须为string和number类型
foo(function (str,n){
//内部不可以有返回值,或者返回undefined
})

5.特殊类型

//字面量类型
const a: 'foo' = 'foo'
const tyoe: 'success' | 'warning' | 'danger' = 'success'
const b: string | number = 'string' //100
// 也可以改写成
// 用type声明一种类型
type StringOrNumber = string | StringOrNumber
const c: StringOrNumber = 'string' //100
//Maybe类型
//此时是number是不能为0或者undefined的
const gender: number = 1
//在类型前面加个?,改写成可以为null或者undefined
const gender2: ?number = null

6.Mixed 与 Any

Mixed和Any都可以用来接收任何类型的值,但是Any是弱类型,Mixed却是强类型。

// Mixed & Any
//Mixed
function passMixed(value:mixed){
value.substr(1)//语法上报错了
value * value //语法上报错了
}
passMixed('String')
passMixed(100)
passMixed(true)
//Any
function passAny(value:any){
value.substr(1)//语法上都不会报错
value * value //语法上都不会报错
}
passAny('String')
passAny(100)
passAny(true)

 7.类型小结

我们其实只了解了Flow里面部分常见的类型,还有一些没有学习到,如果需要的话到时候再自己去查阅文档。

这个是官方的类型文档



Type Annotations | Flow


https://flow.org/en/docs/types/


此外老师推荐了一个第三方的类型文档手册,感觉整理的更加直观。



Flow Type Cheat Sheet


https://www.saltycrane.com/cheat-sheets/flow-type/latest/



4.运行环境API

最后再了解一下 Flow在一些运行环境对于API的支持。因为JS不是独立运行的,会运行在比如浏览器环境、Node环境…

可以右键点击Goto Definition查看文档




推荐阅读
  • 【Vue基础】监听属性watch
    Vue监听属性是watch,我们可以通过watch来响应数据的变化。代码示例: ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • 本文涉及源码版本为2.6.9准备工作down一份Vue源码,从package.json入手,找我们需要的代码1、package.json中的scripts,build:nodesc ... [详细]
  • 认识Vue关于Vue的描述有不少,不外乎都会拿来与Angular和React对比,同样头顶MVVM双向数据驱动设计模式光环的Angular自然被对比的最多,但到目前为止,Angul ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了自学Vue的第01天的内容,包括学习目标、学习资料的收集和学习方法的选择。作者解释了为什么要学习Vue以及选择Vue的原因,包括完善的中文文档、较低的学习曲线、使用人数众多等。作者还列举了自己选择的学习资料,包括全新vue2.5核心技术全方位讲解+实战精讲教程、全新vue2.5项目实战全家桶单页面仿京东电商等。最后,作者提出了学习方法,包括简单的入门课程和实战课程。 ... [详细]
  • 媒介本文的前身是源自github上的项目awesome-github-vue,但由于该项目上次更新时候为2017年6月12日,许多内容早已逾期或是许多近期优异组件未被收录,所以小肆 ... [详细]
author-avatar
美好时光33_862
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有