TypeScript数据类型和使用
Typescript中基本数据类型:布尔类型(boolean)、数值类型(number)、字符串类型(string)、undefined、null等。还有其他数组,元组等类型。
定义的基本格式( 声明 变量名:变量类型 = 赋值)
1.布尔类型(boolean)
//声明一个名字为bool,类型为boolean的变量,赋值为true
let bool: boolean = true;
2.数值类型(number)
//声明一个名字为num,类型为number的变量,赋值为100
let num: number = 100;
3.字符串类型(string)
//声明一个名字为num,类型为number的变量,赋值为100
let str: string = "狗蛋娃"
4.undefined 和 null类型
在typescript中undefined 和 null定义和上面三种类型一样,并且是他们的子集。
//声明变量分别为a1,a2,类型分别为undefined,null,并分别赋值undefined,null
let a1 : undefined = undefined;
let a2 : null = null;
因为undefined 和 null是boolean,number,string的子集,所以执行下面代码不会报错
let a1 : undefined = undefined;
let a2 : null = null;
//undefined和null赋值给boolean,number,string类型的变量
let b1 : number = a1;
let b2 : string = a1;
let b3 : boolean = a1;
let c1 : number = a2;
let c2 : string = a2;
let c3 : boolean = a2;
5.数组类型(array)
数组有常用的有两种定义方式
//声明一个名字为num,类型为number的变量,赋值为100
let list:number[] = [1, 2, 3]; //number[]表示数组存储的类型number
let list:Array<number> = [1, 2, 3]; //泛型定义数组
6.枚举类型(enum)
枚举是列举固定几个值,直接定义变量的话的话可以随意定义,枚举只能使用你定义好的几个值,枚举是个类,定义的值是基本类型,类能有更多操作
//比如定义一个枚举类型Lang,
enum Lang { javascript, typescript, java, node, golang, }
//Lang有五个成员 默认值是从0开始 Lang.javascript 等于 0;Lang.typescript 等于 1
//也可以给枚举成员赋值
enum Lang { javascript = 'javascript',
typescript = 'typescript',
java = 'java',
node = 'node',
golang = 'golang'
}
//此时Lang.javascript等于'javascript'
7.元组类型 (Tuple)
通过元组可以存储不同类型的元素,而非像数组那样只能存储相同元素类型 (any [ ] 除外)。
//定义一个元组存储三个元素,类型依次为 string, number,boolean
let tup: [string, number, boolean] = ['狗蛋娃', 100 , true]
//像数组一样通过下标访问元素 tup[0] tup[1]
如果其中一个值可有可无,在数据类型后面添加?,代表可以省略此属性
//元组tup1的三个属性第2个和第3个是可选的,第一个值是必须的
let tup1: [string, number?, boolean?] = ['狗蛋娃', 100 , true]
tup1 = ['狗蛋娃', 100 ] //只赋值前两个
tup1 = ['狗蛋娃',] //只赋值第一个必须的值
//像数组一样通过下标访问元素 tup[0] tup[1]
8.任意类型(any)和类型推断
typescript的一个重要特性就是添加了静态类型,但有时候为了开发方便等,使用any类型代表变量可以是任意类型。或者可以动态赋值,typescript会自动推断出第一次赋值的类型。
//先声明a变量,这样相当于给a指定为任意类型(any)的变量
let a;a = 100; //等价于 let a :any = 100;
a = true;
a = "狗蛋娃";
任意类型的数组 any [ ]。之前我在想这与元组的区别在哪?我认为区别就在于元组是必须按照定义的格式和顺序赋值,更加严格,毕竟这是ts的特性。
//任意类型数组 可以在数组里面存储任意类型的值
let anyList: any[] = [ "狗蛋娃", 100, { isObj: false }]
类型推断:声明变量后,不指定变量的类型时会在第一次赋值时根据值推断出变量的类型。
let a = 100; //此时typescript自动推断出a的类型为number
a = "狗蛋娃"; //此时再赋值会报错,因为第一次赋值已经推断出a的类型为number
如js那样书写,首先赋值a为100,此时a的类型为number,所有不能再赋值为其他类型的值。
9.绝不类型(never)
never 类型代表从来不会出现的值的类型。
//定义一个never类型的变量
let a: never;
a = 1 // 报错 不能赋值其他类型的值给never类型包括any类型
10.联合类型(多种类型)
有时候在开发中会需要一个值的类型是number或者string,该怎么办呢?除了使用any类型来定义变量满足需求,更加严格的就需要使用联合类型的定义方式。由于 never 是所有类型的子类型, 在联合类型中它始终被省略。
//定义变量a的类型是string或number或string类型的数组
let a : string | number | string[]; //类型之间使用 | 隔开
a = 100; //a赋值为100,类型推断为number
a = "狗蛋娃"; //a赋值为"狗蛋娃",类型推断为string
//定义一个可以存储number和string的数组
let arr : (number | string)[] = [1, "狗蛋娃", 2];
11.总结
上面讲到了除了对象的所有数据类型,因为ts中的对象不像js那样直接定义,需要使用接口interface定义,事情好像并没有那么简单。这些数据类型在实际运用中需要灵活运用,还需学习函数,接口,类等搭配使用。