语法:1) 值 as 类型 value as string
2)<类型>值 value
需要注意的是,类型断言只能够「欺骗」TypeScript 编译器,无法避免运行时的错误,反而滥用类型断言可能会导致运行时错误。
使用any临时断言
window.abc=123
//这样写会报错因为window没有abc这个东西
(window as any).abc=123
//可以使用any临时断言在any类型的变量上,访问任何属性都是允许的
as const
是对字面值的断言,与const直接定义常量是由区别的
如果是普通类型跟直接const声明是一样的
const name='小明'
names='aa' //无法修改
let name2='小明' as const
name2='aa' //无法修改
//数组
let a1=[10,20] as const;
const a2=[10,20];
a1.unshift(30);//错误,此时已经断言字面量为[10,20],数据无法做任何修改
a2.unshift(30);//通过,没有修改指针
//函数
interface A{
run:string
}
interface B{
build:string
}
let fn=(type:A | B):void =>{
console.log((type as A).run)
console.log((<A>type).run)
}
window.abc=123//报错修改
(window as any).abc=123
类型推论
let x=3
typescript会在没有明确指定类型的时候推测出一个类型,这就是类型推论
如果你在声明变量没有定义类型也没有赋值这时候TS会推断成any类型可以进行任何操作
最佳通用类型
当需要从几个表达式中推断类型时候,会使用这些表达式的类型推断出一个最合适的通用类型。最终通用类型取自候选类型,有些时候候选类型共享相同的通用类型。
let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];
如果没有找到最佳通用类型的话,类型推断的结果为联合数组类型,(Rhino | Elephant | Snake)[]
上下文类型
typescript类型推论也可能按照相反的方向进行。这被叫做“按上下文归类”。按上下文归类会发生在表达式的类型与所处的位置相关时。
如果函数表达式不是在上下文类型的位置,mouseEvent
参数的类型需要指定为any
,这样也不会报错了。
这个函数表达式有明确的参数类型注解,上下文类型被忽略。
window.onmousedown=function(mouseEvent:any){
console.log(mouseEvent.button)
}
联合类型
let phone:number|string=1391521
let fn=function(type:number |boolean):boolean{
return !!type// 强转
}
交叉类型
interface Pople{
name:string,
age:number
}
interface Man{
sex:number
}
const xx=(man:Pople & Man):void=>{
console.log(man)
}
xx({
name:'xx',
age:100,
sex:1
})