重点
ts作为js的超集,js的类型在ts中都有,并且ts在js的基础上扩展了一些类型。
js的类型: string,boolean,number,null,undefined,symbol和BigInt(用处比较少)
ts扩展的类型: 元组,枚举,void,never,any
对象类型:非原始类型如:数组
js自带类型
js自带类型没有什么需要总结得。知识有一个不常用的BigInt,用于超出js数据范围的计算
let a = Number.MAX_VALUE + 1
let b = Number.MAX_VALUE + 2
console.log(b > a) // false
超出范围,无法比较
let a = BigInt(Number.MAX_VALUE) + BigInt(1)
let b = BigInt(Number.MAX_VALUE) + BigInt(2)
console.log(b > a) // true
转换成BigInit进行运算。ps:BigInt不能用于与普通数字类型计算如:BigInt(1) + 1
元祖 & 数组
元组
- 元组本身就是数组,定义的时候已经定义好元组的长度,每个位置的数据类型
- 元组不能通过索引的方式增加数据
- 增加数据只能通过push方法,只能增加定义的数据类型
// 定义的时候就必须初始化
const tuple: [string, boolean, number] = ['xx', false, 11]
// tuple[3] = 'xx' 不能这样扩展
// tuple.push(null) 不能push定义之外的类型
tuple.push(true)
console.log(tuple)
数组
数组的用法与js没什么不同的,注意定义数组的时候需要指定类型,例子:
let arr = []
arr.push(1)
会报错如下,需要指定类型
let arr:any= []
arr.push(1)
arr.push('22') //接受任意类型
let arr1:number = [] // 接受数字类型的数组
枚举
enum USER {
'admin',
'dev'
}
console.log(USER[0], USER.dev) // admin 1
基本用法
(function () {
'use strict';
var USER;
(function (USER) {
USER[USER["admin"] = 0] = "admin";
USER[USER["dev"] = 1] = "dev";
})(USER || (USER = {}));
console.log(USER[0], USER.dev);
})();
//# sourceMappingURL=bundle.js.map
编译后代码,可以发现其实枚举就是一个对象:{0: 'admin', 1: 'dev', admin: 0, dev: 1}
异构枚举
enum USER {
'admin' = 1,
'dev' = 'b'
}
像这种指定值,并且值没有规律,就是异构枚举。
常量枚举
以上两种枚举都能正反都能取值:USER[0], USET.admin。常量枚举不能够反向取值,也就是反举。通常用于定义一些常量
const enum USER {
'admin',
'dev'
}
nerver
nerver的意思就是从不,也就是永远不能到达。在ts中有三种情况不能会得到nerver
- 报错
- 死循环
- 类型判断不完整
nerver用途为:
- 标识错误
- 完整性校验(在类型保护章节会遇到)
function MyError():never {
throw new Error('')
// 永远不能到这里
}
function whileTrue():never {
while(true){}
// 永远不能到这里
}
function byType(val: string|number) {
if(typeof val == 'string') {
val
} else if(typeof val == 'number') {
val
} else {
// never 永远不能到这里
val
}
}
let n:never = whileTrue()
null & undefined
这两个是所有类型的子类型,可以讲其赋值给任何类型(非严格模式下)
void
void 空类型, 只能接受null和undefined,通常用于函数返回值。 严格模式下不能接受null
经典问题
- 什么时候标识类型,什么时候不用标识类型
ts自带类型推导。当能够把类型推导出来的时候就不用:
let str = 'str' //此处可以推导出str的类型,可以不用
一些函数的形参,接口里面的约束,类里面的属性。可以带上类型
- string String number Number的区别
string是基本类型,而String是string的引用类型。string只能描述基本类型,String技能描述基本类型,也能描述实例。
let str:String = '' // String描述其基本类型
let str1:String = new String('') // String描述其实例
let str2:string = New String() // 报错,string基本类型不能描述String的实例
平常开发中可以不用在意什么时候使用string,什么时候又使用String。js有装箱和拆箱的功能。通常情况下使用string即可。