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;
错误示范:
代码语言:sql复制//赋值给boolean类型的变量,报错,因为unknown类型只能赋值给unknown、any
let testValue3: boolean = unknownValue;//报错
虽然可以对unknown
类型的变量进行任意赋值,但是却不能执行任何操作,如何解决这个问题呢?可以缩小unknown
类型。具体如下所示:
type func = ()=> unknow
let test = func();
if(test instanceof func){
//执行逻辑
}
我们可以用断言缩小未知范围或者可以用instanceof
来缩小变量的类型,强制让ts编译器相信我们在做什么操作
void(空类型)
声明对象类型为void
时
- 返回为空值
function func(): void { }
声明一个变量为void
时
- 只能将它赋值为 undefined 和 null,因此在定义函数的返回值为
void
时,也可return undefined/null
let voidValue1: void = undefined;
let voidValue2: void = null;
never(不存在的值类型)
never
类型表示永不存在的值的类型。具有以下特点:
never
类型是所有类型的子类型,即never
类型可以赋值给任何类型。- 其他任何类型均不是
never
类型的子类型,即其他类型均不可赋值给never
类型,除了never本身。即使any类型也不可以赋值给never类型。 - 返回类型为
never
的函数中,其终点必须是不可执行的,例如函数过程中抛出了错误或者存在死循环。 - 变量也可以声明为
never
类型,但其不能被赋值
设置变量类型为never
,表示永远不能执行完或者永远Error,具体示例如下:
- 函数中出现了死循环,永远不能执行完,因此其函数类型为:() => never
function infiniteLoop(): never {
while (true) { }
return 'over'
}
- 函数中出现报错,不会执行到
return over
,因此其函数类型为:() => never
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!