首先我们先来对比一下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