TS的基本的数据类型和JS基本数据类型差别较小,因为加入了类型检验,所以在定义变量的时候要加入体现数据类型的语法。此外,还有一些类型是TS新加的或者写法上的变化相对于JS较大的数据类型。
基础类型
因为有类型检验,所以像下面一样这种JS原来的赋值方法是不被允许的。
var foo = 'i am a string.';
foo = 12;
foo = true;
每个变量在定义的时候必须指明类型,而且只能赋值对应类型的值。如下面代码所示:
var foo:string = 'i am a string';
foo = 123; // error
foo = 'i am other string'; // success
基础类型基本上就是 变量名 : 类型
的声明方式。
数字(number)
// number
let decLiteral: number = 20;
let hexLiteral: number = 0x14;; // 十六进制
let binaryLiteral: number = 0b10100; // 二进制
let octalLiteral: number = 0o24; // 八进制
字符串(string)
// string
let name1: string = 'lesifh';
let sentence = `你好,我的名字是${name1}`;
console.log(sentence); // 你好,我的名字是lesifh
布尔值(boolean)
// boolean
var flag:boolean = true;
undefined 和 null
undefined和null类型的值,也只能是undefined 和 null
// undefined
var unknow:undefined = undefined;
// null
var obj:null = null
可能你会说,这有什么用?
但,他们对于变量的声明还是很有用的。比如:
var foo:undefined | number | string;
这个foo变量如果忘记赋值就可以显示为undefined,同时我们也能看出来,typescript对于只声明而不赋值的变量可以通过|
指定多种类型
。
其他类型
数组(array)
数组写法较JS有些差别,并有两种写法。
// array
// 写法一
var list_number:number[] = [1,2,3];
var list_string:string[] = ['l','e','s','i','f','h'];
// 写法二
var list2_number:Array<number> = [1,2,3];
var list2_string:Array<string> = ['l','e','s','i','f','h'];
因为是强类型,所以对于数组的元素做了限制,必须是同一种且是前面定义的数组类型。如果数组元素和定义的数组类型不一样,就会报错(不能通过ts的类型检验),一般的IDE都会直接有提示,想想和以前数组里想放什么就防什么的数组对比,真是严格了不少。
想要在一个数组里面放不同类型元素不可以吗,当然可以。要用到元组
的概念:
元组(tuple)
我想定义一个同时可以设置string和number元素的数组。
var mix:[string, number, boolean];
mix = ['lesifh',23, true]; // success
但是这样有很多限制,就是
(1) 数组元素必须按照定义数组的时候类型的相应位置来赋值
比如
var mix:[string, number, boolean];
mix = [23,'lesifh',true]; // error 第一个应该是字符串,第二个才应该是数字
上面代码中的mix
数组只能接受形如[string, number, boolean]
的值,类型对应非常严格
2. 元素个数也会限制
比如:
var mix:[string, number, boolean];
mix = [23,'lesifh',true]; // error
mix = ['lesifh',23, true, 'lesifh']; //error 定义了三个,赋值赋了四个
那如何回到原来的“美好”呢?需要用到TS的或者any
类型。
任意(any)
顾名思义,允许任何类型的值。和JS原生变量一样没有数据类型限制。
var foo:any ;
any = 1;
any = 'i am a string' ;
TS没有object类型,JS中的对象也可以使用any类型来实现。
var obj:any = {
name: 'lesifh'
}
不过,TS的最大优点就是类型校验,使用了any相当于是放弃了类型校验,any
虽然爽,但也不要能随便用。
JS中的数组也可以用any
实现:
var list:any = [1,'i am a string', {name: 'lesifh'}];
枚举(enum)
枚举类型听名字挺难理解的,举个例子。
比如一个支付操作,会返回状态码,1表示支付成功,-1表示支付失败,0表示取消支付,如果单纯用0,-1,1来表示这些状态并用到代码中,可读性会很差。我对他的理解只在:赋值的时候有更好的阅读性 比如success = Status.success
要比success=1
好些,而且同时success的值就是1
let success = 1;
let fail = -1;
let quit = 0;
if (status_code == success) {
//执行后续操作
} else if(status_code == fail){
// 执行后续操作
} else if (status_code == quit) {
// 执行后续操作
}
数字的可读性没有字母强,这时候,枚举类型的好处就展现出来了
枚举的定义方式和使用
enum Status {
success,
fail,
quit
}
let pay_success:Status = Status.success;
console.log(pay_success); // 1
可以对enum类型变量的元素赋值(数字),不赋值默认自动从0开始。
比如,上面代码中的
Status.success // 0
Status.fail // 1
Status.quit // 2
赋值也很简单。
enum Status{
success = 1,
fail = -1,
quit = 0
}
需要注意的是,在ts中,undefined和null是所有类型的子类型。
never类型
我还不知道有什么用,很少用到。不过,有兴趣的可以看下尤雨溪
大佬在知乎的关于TypeScript中的never类型具体有什么用?的回答。