ES6的数据类型
基本数据类型
- Boolean
- Number
- String
- Symbol
- undefined
- null
引用数据类型
- Object
- Array
- Date
- Function
- ……
TypeScript的数据类型
TypeScript的数据类型在ES6的基础上添加了以下数据类型
- void
- any
- never
- 元组
- 枚举
- 高级类型
类型注解
相当于强类型语言中的类型声明,起到对变量的约束作用
在变量或函数后面加一个冒号,再加上类型名称
语法:(变量/函数):type
基本数据类型注解
在ts中给一个变量声明一个类型后,其值必须是该类型的值,否则在编译时会报错
number类型
let num:number;
num="hello world";
当给一个number类型的变量赋值为字符串,在编译时会给出错误。当把其值改为number类型时,可以成功编译
引用数据类型注解
数组
在ts中给一个变量声明为一个数组需要先指定数组中元素的类型,指定元素的数据类型后,元素的值必须是指定类型的值。
再指定元素的数据类型之后在使用[]指定该变量为一个数组
let num:number[]=[12,43];
如果使用Array指定一个变量为一个数组
let num:Array<number> = [12,43];
如果为数组元素指定多个类型
let num:Array<number| string> = [12,43];
表明数组的元素可以是number类型也可以是string类型,可以是纯number类型,可以是纯string类型可以是number和string的混合
函数
在给函数类型注解时,可以给函数的参数指定类型,也可以给函数的返回值指定类型
给函数的参数指定类型
let add=(x:number,y:number)=>{
}
给函数的返回值指定类型时与之前的写法不同
let add:(x:number,y:number)=>number
add=(a,b)=>a+b
如果不使用箭头函数
function add(x:number,y:number):number{
return x+y;
}
对象
let obj:Object={};
这种方式声明类型只能声明变量的类型
let obj:{name:string,age:number}={name:"agf",age:12}
这种方式不仅可以声明变量的类型还可以声明对象属性的类型
void
表示没有任何返回值的类型,比如没有返回值的函数,这里的返回值是指使用return返回
let an = ()=>{}
any
any类型表示可以是任何类型,可以给变量赋值任何值
let x;//默认为any类型
如果将变量定义为any类型,与js没有区别,也就没有必要使用ts因此不推荐使用
never
表示永远不会有返回值的类型
一种情况是一个函数抛出抛出一个异常,函数永远不会有返回值
let error =()=>{
throw new Error("error")
}
另一种是死循环,函数永远不会执行完毕,永远不会有返回值
let endless=()=>{
while(true){}
}
never与void的区别
void是指函数执行完毕后没有返回值并且是指函数不使用return返回,函数在没有使用return返回时,可以返回undefined的。
never是指在函数能够执行的情况下函数没有执行完毕或者函数不能执行。
枚举类型
一组具有名字的常量集合
//声明枚举
//数字枚举
枚举的值与枚举名之间存在映射关系,我们可以通过枚举值获取枚举名
enum Role{
Reporter,
Developer,
Owner
}
//获取枚举成员
console.log(Role.Reporter) //0
//自定义枚举成员的值
enum Ane{
Reporter=1,
Developer,
Owner
}
//后面的枚举成员的值会依次增加
console.log(Ane.Developer)//2
//字符串枚举
enum Message{
Success="成功",
Fail="失败"
}
//异构枚举
enum Answer{
N,
Y="yes"
}
枚举成员的值是只读类型,定义之后不能修改
枚举成员的类型
- 常量枚举成员
常量枚举成员的值,在编译阶段被计算出来 - computed
需要被计算的枚举成员,通常是函数表达式,不会再编译阶段被计算,会被保留到执行阶段,computed的枚举成员必须有初始值否则会报错。
常量枚举
用const声明的枚举会在编译阶段被移除
不需要一个对象而需要一个对象的值的时候就可以使用常量枚举,减少编译阶段的代码
const enume Month{
Jan,
Feb
}
枚举类型
在某些情况下,枚举和枚举成员都可以作为一种单独的类型存在。
第一种情况,枚举成员没有初始值
枚举类型的变量的值是数值类型
enum E {a,b}
let e : E = 3
第二种情况,所有的成员都是数字枚举
enum F {a=0,b=1}
let f : F = 3 // 枚举类型变量的值可以超出枚举成员的定义
第三种情况,所有成员都是字符串枚举
注意点:
- 两种不同的枚举类型不可以比较
- 字符串枚举类型变量的值只能是枚举成员的类型
enum G {a="apple", b="banana"}
let g1 : G = G.a //可以是 G.a 或 G.b
let g2 : G.a = G.a //只能是G.a
类型推断
- 如果在声明变量时没有规定类型,TS将自行对变量进行推断
let num = 100;
num="Mr.Lee"
根据以上情况我们可以认为,当把100赋值给num时,num的类型就已经确定为number类型,之后就不能赋值为其他类型,当我们强行把字符串"Mr.Lee"赋值给num时就会报错
2. 在声明变量时并没有赋值
let other
other = 100;
other = "Mr.Lee"
根据以上情况,我们可以认为,当我们在声明变量并没有赋值时,TS会推断为any类型
类型断言
- 在处理联合类型的值时,我们可能需要判断类型来做响应处理
我们想要获取一个值的长度
function len(info:string|number){
if(info.length){
}
}
这种方式需要注解的两种类型都具备length属性才会通过,此时该变量的string类型有该属性,number没有出现报错,要想不报错,那么就需要类型断言
类型断言的三种方式
as
function len(info:string|number){
if((info as string).length){
return (info as string).length
}else{
return info.toString().length
}
}
这种方法可以通过编译。以上代码的意思为,TS首先将info认为是string类型,去调用length属性,如果能够调用,就返回length的值,如果不能调用,就使用toString()转换为字符串在调用length属性
let name: string = '';
// 断言成any类型
<any>name
const
const把一个变量的类型断言为一个不可变类型
let name = '';
// 断言成字符串字面量类型
name as const;
!
!类型断言的作用是把类型中的undefined和null类型排除掉