Typescript入门:数据类型

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类型具体有什么用?的回答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值