深夜聊Typescript:关于Never类型(一)

850 阅读2分钟

never类型作为Typescript的原始类型,一直很神秘,因为在实际场景中鲜有用到。它用来描述那些永远无法出现的值。我闭眼一想:如果一个值我永远无法到达或者出现,那我干嘛不删了它?编译器立刻给了我答复:你这么豪横,你咋不自己编译代码!

never类型一般有两个使用场景:

  • 作为函数的返回值,描述那些无法返回的函数

  • 在类型保护下,描述一个永远不为真的类型值

不要提问,我知道上面说的不是人话。咱们实际例子来说说。

永远无法返回的函数

永远无法返回的函数,我闭眼一想:呵呵,哪个傻子能写出这样的代码来?编译器又立刻给了我答复:就是你这个傻子!

场景一:无限循环

const func = function():never{
  while(true){
  console.log('你这个大傻子!')
  }
}

TIPwhile循环一时爽,不加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类型在函数中的诡异表现,我们下次聊聊。