本文主要讲解TS特有类型any和unknown,小伙伴们赶紧学起来呀
any(任意类型)
声明变量类型为any
时
- 编译时会绕过所有类型的检测,直接通过编译阶段的检查
- 可以任意访问属性的方法和属性
any
类型可以赋值给任意类型- 如果变量初始没有定义类型,默认为
any
;经过赋值后,TS会根据赋值类型来标识变量的类型
let anyValue: any = 1;
//修改变量类型
anyValue = true;
//赋值给任意类型,比如boolean
let booleanValue: boolean = anyValue;
console.log(booleanValue)//true
any在使用过程中就像一个潘多拉魔盒,即使使用了断言,也丧失了在静态类型检查阶段发现错误的可能性。
unknow(未知类型)
声明变量类型为unknow
时
- 安全性更高
- 它用于描述类型不确定的变量,这与
any
类型相似,但更安全,因为对未知值做任何事情都是不合法的 unknown
类型只能赋值给any
和unknown
类型,any类型可以赋值给任意类型unknown
,never
都不允许执行变量的方法以及访问内部属性- 在
unknown
没有被断言或细化到一个确切类型之前,unknown
不可以赋值给其它类型,除了它自己和any
外,当然也都是不允许在其上进行任何操作的。
let unknownValue: unknown;
//对变量进行任意赋值
unknownValue = true;
unknownValue = 'sss';
unknownValue = 1;
//赋值给unknown类型的变量
let testValue1: unknown = unknownValue;
//赋值给any类型的变量
let testValue2: any = unknownValue;
错误示范:
//赋值给boolean类型的变量,报错,因为unknown类型只能赋值给unknown、any
let testValue3: boolean = unknownValue;//报错
虽然可以对unknown
类型的变量进行任意赋值,但是却不能执行任何操作,如何解决这个问题呢?可以缩小unknown
类型。具体如下所示:
type func = ()=> unknow
let test = func();
if(test instanceof func){
//执行逻辑
}
我们可以用断言缩小未知范围或者可以用instanceof
来缩小变量的类型,强制让ts编译器相信我们在做什么操作