首先我们先来对比一下ES6和TS的数据类型

ES6的数据类型:

  •     Boolean 
  •     Number
  •     String
  •     Array
  •     Function
  •     Object
  •     Symbol
  •     undefined
  •     null

TypeScript的数据类型:

  • Boolean
  • Number
  •  String
  • Array
  • Function
  • Object
  • Symbol
  • undefined
  • null
  • void
  • any
  • never
  • 元组
  • 枚举
  • 高级类型

ES6中的数据类型我们就不讲解了,下面我们来看一 一探讨一下TS中的数据类型:

先安利一个概念:

类型注解:

  • 作用:相当于强类型语言中的类型声明
  • 语法:(变量/函数):type

TS中的数据类型

1.Boolean类型:

let bool : boolean = true;

2.Number类型:

let num : number = 13;

3.String类型:

let str : string = 'abc';

4.Array类型:

//定义数组有两种方式:

//1.类型名称+[]
let arr1: number[]=[1,2,3];//数字数组
let arr2: string[] = ['h', 'h', 'h']  //字符串数组
let arr3: any[] = [1, 'h', 'h', 3] //允许数组中出现任意类型

//2.Array关键字+<>
let arr4: Array<number>=[1,2,3]  //数字数组
let arr5: Array<string | number>=[1,'b','c'];  //联合类型(表示数组的元素既可以是number,也可以是string类型)

5.元组类型:(是一种特殊的数组,限定了数组的类型和个数)

//number对应 1,string对应'a'
let tuple:[number,string]=[1,'a'];

//元组的越界问题
tuple.push(2);
console.log(tuple);  //[1,'a',2],允许向元组中插入新的元素
tuple[2];  //==>报错,不能越界访问

6.Function类型:

//函数(参数需要定义类型,参数后面的为函数返回值的类型,通常可以省略[ts的类型推断功能])

let add = (x:number,y:number) :number => x+y ;

//下面我们来定义一种函数类型
let compute : (x:number,y:number)=>number;
//具体实现
compute=(a,b)=>a+b;

7.Object类型:

let obj:{x:number,y:string}={x:1,y:"a"};
obj.x=2;

8.Symbol类型:(Symbol的含义就是具有唯一的值)

let s1:symbol=Symbol();
let s2=Symbol();
console.log(s1===s2)  //false

9.undefined类型 / null类型:

//我们可以为一个变量声明为undefined类型,如果声明为undefined,就不能被赋值为其他类型
//而其他类型可以被赋予undefined和null,不过需要修改json文件中的配置
//undefined和null是任何类型的子类型

let un:undefined = 1;  //报错
let nu:null = null;

// 联合类型 , 这样就可以通过类型检查了
let nums:number | undefined | string =undefined;

10.void类型:

  • void  在js中为一种操作符号,让任何数据类型返回undefined
  • void 0;   //undefined
  • 在ts中表示没有任何返回值的类型,比如说,一个没有任何返回值的函数
let noReturn=()=>{}

11.any类型:在ts中如果不指定类型,默认就是any类型

let x;
let x:any ;

12.never类型:表示永远不会有返回值的类型

let error=()=>{
    throw new Error('error');  //一个函数抛出了一个异常,永远不会有返回值
}

let endless=()=>{  //死循环也不会有返回值
    while(true);
}

13.枚举类型:一组有名字的常量集合

//数字枚举
enum Role{
    a,  //0
    b,  //1
    c,  //2
}
//也可以设定初始值,后续递增
enum Role2{
    a =3 ,
    b,  //4
    c   //5
}


//字符串枚举
enum Message {
    success='恭喜你,成功了',
    fail='不好意思,失败了'
}


//一个枚举可以包含零个或多个枚举成员,枚举成员具有一个数字值,它可以是常数或计算得出的值。
enum Car{
    // const ,常量类型,在编译阶段被计算
    a,
    b=Car.a,
    c=1+3,

    //computed,计算类型,会被保留到执行阶段
    d=Math.random(),
    e='123'.length ,
    f = 4 ; //(在computed后面的枚举成员一定要赋予一个初始值)
}
// Car.a=5;  //不能修改,只读类型


//常量枚举(当我们不需要一个对象,而需要对象的值的时候就可以使用常量枚举)
const enum Matho{
    jab,
    c
}
let month=[Matho.jab,Matho.c];  
// 编译后,在编译阶段被移除
// let month=[0,1]


//在某些情况下,枚举和枚举成员都可以作为一种单独的类型存在(以下三种情况)
//两种不同的类型的枚举是不可以比较的,相同的枚举类型是可以比较的
enum E {a,b};
enum F {a=0,b=1};
enum G {a='abc',b='aaa'};

let e:E=3; //我们可以把任意的number类型赋值给枚举类型,它的取值也可以超出枚举成员的定义
let f:F=3; 
// e===f  报错

let e1:E.a
let e2:E.b
//e1 === e2  报错
let e3:E.a
//e1 === e3

//字符串枚举,它的取值只能是枚举成员的类型
let g1:G = G.b
let g2:G.a=G.a