大前端前端开发那些事儿

Flow

2021-05-14  本文已影响0人  丽__

TypeScript 解决javascript 类型系统的问题,TypeScript大大提高代码的可靠程度
// javascript 自有类型系统的问题

一、 类型安全 ------- 强类型与弱类型

概念定义:强类型在语言层面限制函数的实参类型必须与形参类型相同,弱类型语言层面不会限制实参的类型
强类型有更强的类型约束,而弱类型中几乎没有什么约束。
强类型语言中不允许有任意的隐式类型转换,而弱类型语言则允许任意的隐式类型转换
区别:是否允许随意的隐式类型转换器

二、类型检查 ------- 静态类型与动态类型

静态类型语言:一个变量声明时它的类型就是明确的,声明过后,它的类型就不允许在修改
动态类型语言:在运行阶段才能够明确变量类型,而且变量的类型也可以随时改变
在动态类型语言中的变量没有类型,而变量中存放的值是有类型的,javascript 就是一门弱类型,而且是标准的动态类型语言
区别:是否允许随时修改变量类型

image.png
// JavaScript 弱类型产生的问题
// const obj = {}
// obj.foo();

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

console.log(sum(100, 100));
console.log(sum('100', 100));

const obj = {}

obj[true] = 100

console.log(obj['true']);
function square(n:number){
    return n*n
}
square('100')
三、 Flow --- 快速上手

1、安装flow-bin

 npm install -D flow-bin

2、创建package.json

npm init -y

3、初始化项目,执行命令创建一个名为.flowconfig的空文件

flow init

4、关闭vsCode中的js语法校验


image.png

5、在JavaScript文件中的任何代码之前添加 // @flow

//@flow
function square(n: number) {
    return (n * n)
}
console.log(square('5'));

6、运行 flow

flow
image.png

7、要停止后台进程,请运行flow stop

flow stop
image.png
npm i flow-remove-types --dev

2、package.json中修改配置

# 把src目录下的编译之后转到dist目录下
"scripts": {
    "flow": "flow",
    "flowRemove": "flow-remove-types src/ -d dist/"
}

3、运行

npm run flowRemove

可以看到在dist目录下有了编译之后的js文件

方案2 Babel
1、安装Babel

//npm i @babel/core @babel/cli @babel/perset-flow --dev
//报了个错误,perset-flow找不到,后重新分两步运行
npm i @babel/core @babel/cli  --dev
npm install --save-dev @babel/preset-flow
成功

2、新建.babelrc文件

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

3、运行

npx babel src -d dist
image.png
function square(n:number) {
    return n * n
}

square('100')
//@flow

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

square('100')
let num: number = 100
function foo():number{
    return '100'
}
function foo():void{
    // 没有返回值是返回undefined,这里标记为void
}
const a:string = 'foobar'

const b:number = 100 //NaN   Infinity

const c:boolean = false;

const d:null = null

const e:void = undefined

const f:symbol = Symbol()
// @flow

// 数组类型
const arr1: Array < number > = [1, 2, 3]; //全是数字的数组

const arr2: number[] = [1, 2.3]; //全是有数字组成的数组

// 元组
const arr3: [string, number] = ['foo', 100];//固定长度和类型的数组
//@flow

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

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


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

obj3.key1 = 'value'
obj3.key2 = 100
//@flow
// 函数的类型限制

function foo(cllback: (string, number) => void) {
    cllback('string', 100);
}
foo(function (str, n) {});

// @flow

const a: "foo" = "foo";

const type: "success" | "warning" | "danger" = "success";

type StringOrNumber = string | number;

const b: string | number = 1; //'string';
const c: StringOrNumber = "string"; //100;

const gender: ?number = null; //maybe 类型
const gender1: number | null | void = null; //等同于
// @flow
// Mixed Any

// 强类型
// string \ number \ boolean ...任何类型
function passMixed(value: mixed) {
  if (typeof value === "string") {
    value.substr(1);
  } else {
    value * value;
  }
}

passMixed("string");
passMixed(100);

// -------------------------
// 弱类型
function passAny(value: any) {
  value.substr(1);
  value * value;
}

passAny("string");
passAny(100);
image.png
上一篇下一篇

猜你喜欢

热点阅读