never
類型做爲Typescript的原始類型,一直很神祕,由於在實際場景中鮮有用到。它用來描述那些永遠沒法出現的值。我閉眼一想:若是一個值我永遠沒法到達或者出現,那我幹嗎不刪了它?編譯器馬上給了我答覆:你這麼豪橫,你咋不本身編譯代碼!typescript
never
類型通常有兩個使用場景:函數
做爲函數的返回值,描述那些沒法返回的函數ui
在類型保護下,描述一個永遠不爲真的類型值spa
不要提問,我知道上面說的不是人話。我們實際例子來講說。code
永遠沒法返回的函數,我閉眼一想:呵呵,哪一個傻子能寫出這樣的代碼來?編譯器又馬上給了我答覆:就是你這個傻子!ip
場景一:無限循環文檔
const func = function():never{
while(true){
console.log('你這個大傻子!')
}
}
複製代碼
TIP:
while
循環一時爽,不加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
類型的變量
在函數表達式或者箭頭函數中,若是函數沒有聲明返回類型,且沒有return
語句,後者return
語句返回的表達式沒法到達函數底部,則該函數的返回類型推斷爲never
類型
若是一個函數有明確的返回值類型聲明,且爲never
類型,則函數內部全部的return
語句必須明確返回never
類型,或者函數底永遠沒法達到
關於never
類型在函數中的詭異表現,咱們下次聊聊。