never类型作为Typescript的原始类型,一直很神秘,因为在实际场景中鲜有用到。它用来描述那些永远无法出现的值。我闭眼一想:如果一个值我永远无法到达或者出现,那我干嘛不删了它?编译器立刻给了我答复:你这么豪横,你咋不自己编译代码!
never类型一般有两个使用场景:
-
作为函数的返回值,描述那些无法返回的函数
-
在类型保护下,描述一个永远不为真的类型值
不要提问,我知道上面说的不是人话。咱们实际例子来说说。
永远无法返回的函数
永远无法返回的函数,我闭眼一想:呵呵,哪个傻子能写出这样的代码来?编译器又立刻给了我答复:就是你这个傻子!
场景一:无限循环
const func = function():never{
while(true){
console.log('你这个大傻子!')
}
}
TIP:
while循环一时爽,不加break你想飞?
场景二:抛出异常
const func = function():never{
throw new Error('醒醒吧')
}
TIP:别老用一行
console来遮掩你的无知
类型保护到逻辑死角
智商是个好东西,在逻辑这块你非要和计算机比,那你就比一比。
场景:无法推测的变量类型
const handleStringOrNumber = function(value:string|number){
if(typeof value === 'string'){
// 我是string
}else if(typeof value === 'number'){
// 我是number
}else{
// 我是谁?我在哪
// value 是一个 never类型
}
}
TIP:严谨没毛病
灵魂拷问:never作为原始类型和其他类型的关系?
我让你看文档,你看了么?你不看我怎么办?我只能给你照搬过来:
-
never类型是所有类型的子类型,可以赋值给任何类型的值 -
除
never类型外,任何类型都不是never的子类型,也不能赋值给never类型的变量 -
在函数表达式或者箭头函数中,如果函数没有声明返回类型,且没有
return语句,后者return语句返回的表达式无法到达函数底部,则该函数的返回类型推断为never类型 -
如果一个函数有明确的返回值类型声明,且为
never类型,则函数内部所有的return语句必须明确返回never类型,或者函数底永远无法达到
关于never类型在函数中的诡异表现,我们下次聊聊。