Flow语法入门总结

mac2025-07-18  3

看一段常见代码

function foo(x) { return x + 10 } foo('Hello!')

上述的函数传参肯定不是我们希望的,因为JavaScript 是一门动态类型语言,变量和参数的类型是可以随时改变的,这样会提高在运行时产生错误的概率。但是怎么去避免这样的错误呢?

#Flow语法

没有类型的静态检查是 JavaScript 语言的先天缺失,所有很多变量类型相关的问题只能在运行阶段暴露出来。为了使 JavaScript 语言的类型更加安全,业界的实践有 TypeScript;这些都需要你重新学习一套语言语法,然后由编译器把相应的代码编译成原生的 JavaScript 代码;在一个现有的系统中把当前代码改成 TypeScript 成本比较高,需要重写所有逻辑。Facebook 推出的 Flow 是一个静态类型检测工具;在现有项目中加上类型标注后,可以在代码阶段就检测出对变量的不恰当使用。Flow 弥补了 JavaScript 天生的类型系统缺陷。利用 Flow 进行类型检查,可以使你的项目代码更加健壮。

#Flow 的使用

如何对一个文件进行类型检查?

// @flow // 或者下面这种 /* @flow */

#基本类型的类型标注语法

JavaScript 中的基本类型,类型标注语法是在变量后加上一个冒号,空格,然后是相应的类型名称,如:

// @flow const a: string = 'zhihu' const b: number = 5 const c: boolean = false const d: void = undefined const e: null = null

以上需要注意的几点:

undefined 的类型是 void;null 的类型是 null;string 类型、number 类型和 boolean 类型,其类型名称都是小写开头;但是在 JS 中还有相对应的大写开头的类型名称,如 String,Number, Boolean;

#函数类型标注

对函数类型我们主要是标注其接受的参数类型和返回值类型;下面的示例中分别展示了如何对函数声明、函数表达式,以及箭头函数加上类型标注。

// @flow // 函数声明 function getLength(str: string): number { return str.length } // 函数表达式 const greeting = function(welcome: string): void { console.log(welcome) } // 箭头函数 const addNumber = (a: number, b: number): number => a + b

#数组类型标注

对数组的标注 Flow 提供两种语法,

Array 后接一对尖括号,且尖括号里边就是数组项的类型名称;类型名称后加一对中括号。 // @flow const names: Array<string> = ['a', 'b', 'c'] const ages: number[] = [1, 2, 3, 4]

#元组(Tuple)类型的标注

另外一种常见的数组是元组(Tuple)。在其他语言里,元组可能是一个特定的类型结构;但是在 JS 里,元组就是数组来表示的,并且是一个有限数组,数组每一项的类型分别标注出来。

// @flow const recordItem: [number, string, boolean] = [1, 'First', true]

#对象类型的标注

对对象类型加上类型标注的方式是定义其结构(Shape),即有哪些属性,属性及属性值的类型;

// @flow type BorderConfigType = { width: number, color: string, hasShadow: boolean } const borderConfig: BorderConfigType = { width: 10, color: 'red', hasShadow: true }

type 是 Flow 中的关键字,用来定义自定义的类型,并且可以在后面的类型标注中使用。例如:

// @flow type StringType = string; const name: StringType = ‘zhihu’; type TupleType = [ number, string ] const record: TupleType = [ 1, ‘a’ ]

#类的标注

Flow 支持对 ES6 中的类进行类型标注:包括类的属性和方法;类中用到的属性必须额外添加类型标注,并且是在与方法同一个层级(而不是在方法体内部)。

// @flow class WrongClass1{ method(){ this.props = 1; // Flow 会报错,因为没有对 props 进行类型标注 } } class WrongClass2{ method(){ this.props: number = 1; // Flow 还是会报错,对属性的类型标注必须与方法同一个层级 } } class RightClass { props: number; // 对,就像这样。 method(){ this.props = 1; } } class MyClass{} const mc: MyClass = new MyClass();

#使用Flow的优点

轻且易学易用,它的学习曲线没有TypeScript来得高,虽然内容也很多,但半天学个大概,就可以渐进式地开始使用Flow从头到尾只是个检查工具,不是新的程序语言或超集语言,所以它可以与各种现有的JavaScript代码兼容,如果你哪天不想用了,就去除掉标记就是回到原来的代码,没什么负担
最新回复(0)