联合类型
联合类型能够让我们可选我们自己需要的类型部分,如果需要的类型超过或者达到2个,那就可以使用。
那为什么不使用any呢?那是因为我们需要的并不是所有类型都能通过,我只希望这两个或者3个类型能够通过,如果需要的类型超过或着达到两个都使用any的话,那就和JavaScript原生没有区别了
//例如我们的手机号通常是13XXXXXXX 为数字类型 这时候产品说需要支持座机
//所以我们就可以使用联合类型支持座机字符串
letmyPhone: number|string ='010-820'
//这样写是会报错的应为我们的联合类型只有数字和字符串并没有布尔值
letmyPhone: number|string =true//报错
函数使用联合类型
这个!!是怎么回事呢?
我们知道一串数字想变成字符串只要加上""就能隐式转换成字符串。
那一个类型只要
!
就能进行反转,!只有正反,也就是false跟true,这种就有点类似隐式转换了,我们连续转两次就相当于当前形式的布尔值类型了
letfn=function(type:number):boolean {
return!!type//将type强行转化为布尔值类型,如果没用进行转化的话是会报错的
}
--------------------------------------------------------------------
letfn=function(type:number|boolean):boolean {
return!!type//将type强行转化为布尔值类型,如果没用进行转化的话是会报错的
}
letresult=fn(1)
console.log(result);//true
交叉类型
多种类型的集合,联合对象将具有所联合类型的所有成员
interfacePople{
name:string
age:number
}
interfaceMan{
sex:number
}
constxiaoman= (man:Pople&Man):void=> {//这里通过了&将Pople跟Man交叉在了一起,则man需要处理Pople也要处理Man。还可以继续跟更多个interface
console.log(man)
}
xiaoman({
name:"小满今天坏掉了"
age:18
sex:1//如果sex不写是会报错的,会提示你少写了一个sex
})
类型断言
语法格式,值 as 类型 或者 <类型>值
需要注意的是,类型断言只能够「欺骗」TypeScript 编译器,无法避免运行时的错误,反而滥用类型断言可能会导致运行时错误
覆盖它的推断,并且能以你任何你想要的方式分析它,这种机制被称为「类型断言」。TypeScript 类型断言用来告诉编译器你比它更了解这个类型,并且它不应该再发出错误
当
S
类型是T
类型的子集,或者T
类型是S
类型的子集时,S
能被成功断言成T
。这是为了在进行类型断言时提供额外的安全性,完全毫无根据的断言是危险的,如果你想这么做,你可以使用any
。2、类型断言的用途
(1)将一个联合类型推断为其中一个类型
(2)将一个父类断言为更加具体的子类
(3)将任何一个类型断言为 any
(4)将 any 断言为一个具体的类型
原型:
letfn=function(num:number|string):void{
console.log(num.length);//这里会报错,因为我们确实没有.length这个内容
}
fn("12345")
--------------------------------------------------------
断言写法
letfn=function(num:number|string):void{
console.log((numasstring).length);//用括号括起来,as断言他是string类型
}
fn("12345")//这样会打印出5
fn(12345)//这样会打印出undefined
另一个例子
interfaceA{
run:string
}
interfaceB{
build:string
}
letfn(type:A|B) =>{
console.log((<A>type).run);
}
fn({
build:"123"//这里是没办法传过去的,断言是不能够滥用的,因为我们确实没有.run这个内容
})
临时断言
1.使用any临时断言
window.abc=123
//这样写会报错因为window没有abc这个东西
(windowasany).abc=123
//可以使用any临时断言在 any 类型的变量上,访问任何属性都是允许的。
在下面的例子中,将 something 断言为 boolean 虽然可以通过编译,但是并没有什么用 并不会影响结果,因为编译过程中会删除类型断言
functiontoBoolean(something: any): boolean {
returnsomethingasboolean;
}
letbbb= toBoolean(1);
console.log(bbb)
// 返回值为 1
//
as const
是对字面值的断言,与 const 直接定义常量是有区别的
如果是普通类型跟直接 const 声明是一样的
constnames='小满'
names='aa'//无法修改
letnames2='小满'asconst
names2='aa'//无法修改
// 数组
leta1= [10, 20] asconst;
consta2= [10, 20];
a1.unshift(30); // 错误,此时已经断言字面量为[10, 20],数据无法做任何修改
a2.unshift(30); // 通过,没有修改指针。之所以没有修改指针是因为const的性质是决定了指针指向的位置是已经固定不会发生改变的了,这个30想要添加进去除非直接修改存储值的地方