类型概念

依据类型平安能够将编程语言的类型零碎分为强类型或者弱类型。
依据类型查看能够将编程语言的类型零碎分为动态类型和动静类型。

强类型vs弱类型

因为历史因素,强类型和弱类型并没有十分明确的定义。依据集体了解,能够用上面这句话辨别强弱类型。

次要用以形容编程语言对于混入不同数据类型的值进行运算时的解决形式。强类型的语言遇到函数引数类型和理论调用类型不匹配的状况常常会间接出错或者编译失败;而弱类型的语言经常会履行隐式转换,或者产生难以预料的后果。

在下例中,调用printNumber的时候传入数字或者字符串均可,是一种弱类型语言。

function printNumber(number){    console.log(number)}printNumber(100) //okprintNumber('100') //ok

在下例中,printNumber明确要求传入int整型,如果调用时传入字符串就会在编译时出错,因而是强类型语言。

class Main{    static void printNumber(int num) {        System.out.printIn(num)    }    public static void main() {        Main.printNumber(100) // ok        Main.printNumber('100') // ok    }}

动态类型vs动静类型

动态类型指的是变量的类型在编译时总是已知的,也就是变量申明实现后,不能扭转其类型。

class Main{    public static void main() {        int number = 100        number = 50 //ok        number = '50' // error, 尝试扭转类型    }}

动静类型指的是变量的类型直到运行时能力确定,也就是变量申明实现后,可随便更改其类型。

function main() {    let num = 100    num = 50 // ok    num = '50' // ok}

js类型概述

家喻户晓,javascript是弱类型语言,也是一种动静类型语言。这是由语言设计时的局限性决定的,过后,js只是用来实现简略的性能,所以弱类型和动静类型能够更为不便。然而,当初js也能反对大型的利用开发,其类型的弊病就裸露进去。

setTimeout(() => {    // 在这种状况下,开发和简略测试过程中不会发现问题,只有运行一段时间后才会爆出问题。    console.log(a)}, 3000000);let obj = {    // 如果想要更改此属性值,因为不晓得有多少代码中引入此属性,所以不敢轻易更改。    name: 'zhangsan'}console.log(obj.name)

flow

flow是一种JavaScript动态类型查看工具,通过类型注解的形式在我的项目编写过程中对类型加以限度,从而更早发现代码问题,有利于我的项目的开发和保护。

类型注解:通过:的形式对变量的类型加以限度。

/** * @flow */function sum(a: number, b: number) {    return a + b}sum(1, 2) // oksum('1', 2) //error// 因为sum要求参数是数字,然而调用的时候传入了字符串,所以在查看的时候flow会报错。

类型推断:依据应用状况主动推断类型。

/** * @flow */function square(a) {    // 调用函数的时候传入字符串,所以函数会主动推断a参数为字符串,因为字符串不容许相乘,因而查看会报错。    return a * a}square('a')

原始类型

原始类型对应js中的原始类型。

const a: string = 'foo'const b: number = 1 // 也能够赋值NaN(NaN是一种非凡的数字类型)const c: boolean = true // falseconst d: void = undefinedconst e: null = nullconst f: symbol = Symbol()

数组类型

// 应用范型定义数组const a: Array<number> = [1, 2, 3]const b: number[] = [1, 2, 3]// 应用元组定义数组类型:定义数组个数及每项类型。const c: [string, number] = ['foo', 1]

对象类型

// 相似对象字面量的形式定义对象中每个属性的类型const obj: {    name: string,    age: number,    // 可选    address?: string} = {    name: 'zhangsan',    age: 18}

函数类型

// 通过箭头函数的形式定义函数类型function ajax(callback: (string, number) => void) {    callback('zhangsan', 18)}

非凡类型

字面量类型

// 指定一个字面量为一个参数的类型, 通常字面量类型会和上面的联结类型应用const foo: 'foo' = 'foo'

联结类型

// 指定类型为多个字面量类型中的一个const type: 'warning' | 'success' | 'error' = 'error'// 指定类型为数组,数组能够蕴含数字或者字符串const arr: Array<number | string> = [1, '2']

type关键字

// 通过type关键字定义一个类型,能够认为resultType是'warning' | 'success' | 'error'的别名type resultType = 'warning' | 'success' | 'error'// 应用时能够间接用resultType定义类型,不便复用const type: resultType = 'error'

Maybe可空类型

// 通过?定义可空类型,相当于 number | voidlet a: ?number = 1 a = undefined

mixed, any

// 通过mixed定义任意类型,能够是根底类型中的任意一个let a: mixed = 1 a = 'foo'// any也能够示意任意类型,体现上和mixed类似let a: any = 1a = 'foo'

mixed和any尽管体现雷同,都代表任意类型,然而二者是不一样的,mixed尽管示意任意类型,然而它还是强类型。

function anytest(s: any) {    return s.substr(0, 1)}// 应用any时,能够传入任意类型的值,尽管数字可能不存在substr办法,然而查看时不会报错anytest(1)function mixedtest(s: mixed){    // 应用mixed时,当这么间接调用substr就会报错,因为可能传入number类型。    // return s.substr(0, 1)    // 此时须要判断参数类型    if(typeof s === 'string') {        return s.substr(0, 1)    }}mixedtest(1)

其余类型

下面介绍了flow中罕用的类型,其还蕴含一些不罕用的类型,遇到后再补充。