最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript中的never類型你了解嗎

 更新時(shí)間:2023年10月17日 10:40:37   作者:前端小碼哥  
TypeScript 中的 never 類型,表示:永遠(yuǎn)不會發(fā)生的值的類型,換句話說,就是不可能存在的類型,即沒有值的類型,那么你了解TypeScript中的never類型嗎,感興趣的朋友跟著小編一起來看看吧

1. never 類型的理解

TypeScript 中的 never 類型,表示:永遠(yuǎn)不會發(fā)生的值的類型。

換句話說,就是不可能存在的類型,即沒有值的類型。

2. 可能會出現(xiàn) never 類型的一些情況

2.1. 函數(shù)拋出異常

如果一個(gè)函數(shù)拋出異常,那么它的返回類型就是 never。因?yàn)樵诤瘮?shù)拋出異常后,會直接中斷程序的運(yùn)行,這使得程序不會繼續(xù)執(zhí)行到函數(shù)的返回語句那一步。

上面的例子中,函數(shù) throwError 拋出異常,鼠標(biāo)移到 throwError 函數(shù)上面,可以看到函數(shù)的返回值類型為 never。

2.2. 不會有返回值的函數(shù)

如果一個(gè)循環(huán)永遠(yuǎn)無法正常結(jié)束,比如無限循環(huán)或者總是拋出異常,那么該循環(huán)的類型被推斷為 never。

上面的例子中,函數(shù) infiniteLoop 是一個(gè)無限循環(huán)函數(shù),沒有任何的終止循環(huán)的語句,函數(shù)執(zhí)行永遠(yuǎn)不會結(jié)束,因此不會有任何的返回值,鼠標(biāo)移到 infiniteLoop 函數(shù)上面,可以看到函數(shù)的返回值類型為 never。

2.3. 類型判斷或類型縮小的細(xì)化(全面性檢查)

在條件語句中,如果 TypeScript 能夠推斷出某個(gè)分支永遠(yuǎn)不會執(zhí)行,那么該分支的類型會被推斷為 never 。

type Value = number | string;
const processValue = (value: Value) => {
  if (typeof value === "number") {
    // 在這個(gè)分支中,value 的類型被細(xì)化為 number
  } else if (typeof value === "string") {
    // 在這個(gè)分支中,value 的類型被細(xì)化為 string
  } else {
    // 在這個(gè)分支中,value 的類型被細(xì)化為 never,因?yàn)?value 不可能同時(shí)為 string 和 number
    const n: never = value
  }
}

上面的例子中,else 分支里面,value 的類型將被細(xì)化為 never 類型,然后我們將 value 賦值給一個(gè)顯示聲明了 never 類型的變量,如果邏輯正確,上面的代碼可以正常編譯通過,但如果你把 Value 的類型改成 number | string | boolean 的聯(lián)合類型,此時(shí) else 分支的 value 類型就會被細(xì)化成 boolean 類型,此時(shí)把 value 賦值給一個(gè)顯示聲明了 never 類型的變量就會報(bào)錯(cuò)。

type Value = number | string | boolean;
const processValue = (value: Value) => {
  if (typeof value === "number") {
    // 在這個(gè)分支中,value 的類型被細(xì)化為 number
  } else if (typeof value === "string") {
    // 在這個(gè)分支中,value 的類型被細(xì)化為 string
  } else {
    // 在這個(gè)分支中,value 的類型被細(xì)化為 boolean 類型,因?yàn)?value 不可能同時(shí)為 string 和 number
    // 此時(shí),把 value 賦值給一個(gè)顯示聲明了 never 類型的變量 n 就會報(bào)錯(cuò)。
    // 下面的賦值語句會報(bào)錯(cuò):不能將類型“boolean”分配給類型“never”。
    const n: never = value
  }
}

3. never 類型的特點(diǎn)

3.1. never 類型會從聯(lián)合類型中移除

任意類型和 never 類型的聯(lián)合類型都是其本身,就好比如:任意數(shù)字和0相加,都等于該數(shù)字。

type T1 = number | never;  // number
type T2 = string | never;  // string
type T3 = boolean | never; // boolean
type T4 = any | never;     // any
type T5 = unknown | never; // unknown
type T6 = never | never;   // never
type T7 = "abc" | never;   // "abc"
type T8 = 123 | never;     // 123

利用這個(gè)特點(diǎn),我們可以做很多事情,比如:篩選。

我們可以利用條件類型把不符合類型 Type 的類型先轉(zhuǎn)換成 never 類型,然后利用聯(lián)合類型把 never 類型過濾掉,得到我們想要的結(jié)果。

type Filter<T, U> = T extends U ? T : never
type RESULT = Filter<"Echo" | 26 | true | "GuangZhou", string>

上面的代碼,按照分布式條件類型機(jī)制,Filter<"Echo" | 26 | true | "GuangZhou", string> 將被分解成如下代碼:

type RESULT = 
  | ("Echo" extends string ? "Echo" : never) 
  | (26 extends string ? 26 : never) 
  | (true extends string ? true : never) 
  | ("GuangZhou" extends string ? "GuangZhou" : never)

進(jìn)一步被解析,得到如下代碼:

type RESULT = "Echo" | never | never | "GuangZhou"

再一步解析,得到結(jié)果:

type RESULT = "Echo" | "GuangZhou"

3.2. never 類型與任意類型的交叉類型都是 never

type T1 = number & never;  // never
type T2 = string & never;  // never
type T3 = boolean & never; // never
type T4 = any & never;     // never
type T5 = unknown & never; // never
type T6 = never & never;   // never
type T7 = "abc" & never;   // never
type T8 = 123 & never;     // never

3.3. never 可以賦值給任意類型

由于 never 類型是所有其他類型的子類型,所以可以將 never 賦值給任何其他類型。

let n: never
let str: string = n
let num: number = n
let b: boolean = n
let any: any = n
let unknown: unknown = n
let func: () => void = n
let symbol: symbol = n
let n1: never = n

3.4. 其他類型不能賦值給 never

由于 never 沒有子類型,所以除了 never 本身,任何類型都不能賦值給 never 類型。

let n: never
n = "Echo"               // 報(bào)錯(cuò):不能將類型“string”分配給類型“never”
n = 26                   // 報(bào)錯(cuò):不能將類型“number”分配給類型“never”
n = true                 // 報(bào)錯(cuò):不能將類型“boolean”分配給類型“never”
n = [1, 2, 3]            // 報(bào)錯(cuò):不能將類型“number[]”分配給類型“never”
n = Symbol()             // 報(bào)錯(cuò):不能將類型“symbol”分配給類型“never”
n = {}                   // 報(bào)錯(cuò):不能將類型“{}”分配給類型“never”
n = new Array()          // 報(bào)錯(cuò):不能將類型“any[]”分配給類型“never”
n = (...arg: any) => {}  // 報(bào)錯(cuò):不能將類型“(...arg: any) => void”分配給類型“never”

4. 總結(jié)

以上就是我對 TypeScript 中 never 類型的理解,如果有不正確的地方,歡迎大家在評論區(qū)多多指正!

到此這篇關(guān)于TypeScript中的never類型你了解嗎的文章就介紹到這了,更多相關(guān)TypeScript never類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用JavaScript修改瀏覽器URL地址欄的實(shí)現(xiàn)代碼

    使用JavaScript修改瀏覽器URL地址欄的實(shí)現(xiàn)代碼

    這篇文章主要介紹了如何使用JavaScript修改瀏覽器URL地址欄,需要的朋友可以參考下
    2013-10-10
  • 使用BootStrap實(shí)現(xiàn)懸浮窗口的效果

    使用BootStrap實(shí)現(xiàn)懸浮窗口的效果

    本文給大家分享使用BootStrap實(shí)現(xiàn)懸浮窗口的效果,神奇的 bootstrap就自帶了這個(gè)功能。所以就用bootstrap的popover插件做了,效果還不錯(cuò),感興趣的朋友參考下吧
    2016-12-12
  • js中的兩種定時(shí)器區(qū)別是什么以及怎么清除定時(shí)器詳解

    js中的兩種定時(shí)器區(qū)別是什么以及怎么清除定時(shí)器詳解

    在做項(xiàng)目中難免會碰到需要實(shí)時(shí)刷新,動畫依次出現(xiàn)等等需求,這時(shí)候就需要定時(shí)器登上我們的代碼舞臺了,這篇文章主要介紹了js中兩種定時(shí)器區(qū)別是什么以及怎么清除定時(shí)器的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • JavaScript清空數(shù)組元素的兩種方法簡單比較

    JavaScript清空數(shù)組元素的兩種方法簡單比較

    這篇文章主要介紹了JavaScript清空數(shù)組元素的兩種方法簡單比較,羅列了幾種常見的情況javascript數(shù)組的方法,并且比較了其中的兩種常見方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 最全正則表達(dá)式總結(jié):驗(yàn)證QQ號、手機(jī)號、Email、中文、郵編、身份證、IP地址等

    最全正則表達(dá)式總結(jié):驗(yàn)證QQ號、手機(jī)號、Email、中文、郵編、身份證、IP地址等

    這篇文章主要介紹了最全正則表達(dá)式:驗(yàn)證QQ號、手機(jī)號、Email、中文、郵編、身份證、IP地址等,通過語法介紹作用表達(dá)式等詳細(xì)解釋了正則表達(dá)式的使用,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • 微信小程序wx.navigateTo方法里的events參數(shù)使用詳情及場景

    微信小程序wx.navigateTo方法里的events參數(shù)使用詳情及場景

    這篇文章主要介紹了微信小程序wx.navigateTo方法里的events參數(shù)使用詳情及場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • javascript特殊日歷控件分享

    javascript特殊日歷控件分享

    這篇文章主要為大家詳細(xì)介紹了javascript特殊日歷控件的使用方法,展示了javascript日歷控件實(shí)現(xiàn)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • JavaScript模塊導(dǎo)入和導(dǎo)出方式舉例

    JavaScript模塊導(dǎo)入和導(dǎo)出方式舉例

    文章介紹了ES6模塊化方法,涵蓋命名導(dǎo)出(多值導(dǎo)出,需指定名稱)、默認(rèn)導(dǎo)出(單一值導(dǎo)出,簡化使用)、動態(tài)導(dǎo)入(按需加載)及as關(guān)鍵字(重命名,解決沖突)等核心內(nèi)容,對js模塊導(dǎo)入和導(dǎo)出相關(guān)知識感興趣的朋友一起看看吧
    2025-09-09
  • js日歷功能對象

    js日歷功能對象

    問題產(chǎn)生需求:做OA時(shí)弄到 備忘這個(gè)功能,想以日歷的形式展現(xiàn)
    2012-01-01
  • JS Ajax請求如何防止重復(fù)提交

    JS Ajax請求如何防止重復(fù)提交

    這篇文章主要介紹了JS Ajax請求如何防止重復(fù)提交的相關(guān)資料,通過覆蓋掉$.ajax而達(dá)到防止重復(fù)提交的問題,實(shí)現(xiàn)代碼簡單,需要的朋友可以參考下
    2016-06-06

最新評論

静乐县| 葫芦岛市| 三原县| 香格里拉县| 竹溪县| 和田县| 兴文县| 灵山县| 朝阳区| 浦东新区| 泸定县| 民乐县| 舒城县| 治多县| 星座| 洪洞县| 蒙自县| 临颍县| 石棉县| 潍坊市| 阿图什市| 安丘市| 秦安县| 政和县| 正宁县| 遂宁市| 新闻| 天水市| 佛山市| 巩留县| 昌图县| 乐陵市| 增城市| 伊宁县| 城固县| 江孜县| 新乐市| 苍溪县| 枣阳市| 昌图县| 莲花县|