深夜聊Typescript:關於Never類型(一)

never類型做爲Typescript的原始類型,一直很神祕,由於在實際場景中鮮有用到。它用來描述那些永遠沒法出現的值。我閉眼一想:若是一個值我永遠沒法到達或者出現,那我幹嗎不刪了它?編譯器馬上給了我答覆:你這麼豪橫,你咋不本身編譯代碼!typescript

never類型通常有兩個使用場景:函數

  • 做爲函數的返回值,描述那些沒法返回的函數ui

  • 在類型保護下,描述一個永遠不爲真的類型值spa

不要提問,我知道上面說的不是人話。我們實際例子來講說。code

永遠沒法返回的函數

永遠沒法返回的函數,我閉眼一想:呵呵,哪一個傻子能寫出這樣的代碼來?編譯器又馬上給了我答覆:就是你這個傻子!ip

場景一:無限循環文檔

const func = function():never{
  while(true){
  console.log('你這個大傻子!')
  }
}
複製代碼

TIPwhile循環一時爽,不加break你想飛?編譯器

場景二:拋出異常string

const func = function():never{
  throw new Error('醒醒吧')
}
複製代碼

TIP:別老用一行console來遮掩你的無知it

類型保護到邏輯死角

智商是個好東西,在邏輯這塊你非要和計算機比,那你就比一比。

場景:沒法推測的變量類型

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類型在函數中的詭異表現,咱們下次聊聊。

相關文章
相關標籤/搜索