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

TypeScript中never 類型的神奇妙用

 更新時(shí)間:2025年12月30日 11:23:04   作者:代碼里的小貓咪  
在TypeScript中,never是一個(gè)特殊類型,通常用于表示不可能發(fā)生的情況,它適用于拋出異常、不返回值的函數(shù)或處理邏輯上永遠(yuǎn)不會(huì)出現(xiàn)的分支,下面就來(lái)詳細(xì)的介紹一下如何使用,感興趣的可以了解一下

在 TypeScript 中,never 是一個(gè)特殊類型,表示「永不存在的值類型」,通常用于表示不可能發(fā)生的情況。它適用于拋出異常、不返回值的函數(shù)或處理邏輯上永遠(yuǎn)不會(huì)出現(xiàn)的分支。

以下是它的簡(jiǎn)單用法和注意事項(xiàng):

1. never 的用法

1、拋出異常的函數(shù):當(dāng)函數(shù)會(huì)拋出錯(cuò)誤并終止執(zhí)行時(shí),返回類型應(yīng)定義為 never。

??:

function throwError(message: string): never {
  throw new Error(message);
}

 2、死循環(huán)的函數(shù):永遠(yuǎn)不會(huì)結(jié)束的函數(shù)(例如:無(wú)限循環(huán))也可以使用 never 類型。

??:

function infiniteLoop(): never {
  while (true) {}
}

3、類型保護(hù)中的檢查:在類型縮小過(guò)程中,用 never 檢查不可能的情況,有助于提高代碼的嚴(yán)格性和可讀性。

??:

function handleValue(value: string | number) {
  if (typeof value === 'string') {
    console.log('String value');
  } else if (typeof value === 'number') {
    console.log('Number value');
  } else {
    // 如果 value 類型是 never,編譯器會(huì)檢查這里的情況是否可能發(fā)生
    const _exhaustiveCheck: never = value;
    throw new Error('Unexpected type: ' + value);
  }
}
handleValue('string');
handleValue(1);
handleValue(true);

2. never 的神奇

1、確保類型全面覆蓋:在處理 switch 或多類型分支時(shí),never 可用于強(qiáng)制檢查是否所有可能的分支都被覆蓋,幫助捕獲遺漏的情況。

??:假設(shè)有個(gè)表示用戶狀態(tài)的聯(lián)合類型 UserStatus:

type UserStatus = "active" | "inactive" | "banned";

function handleUserStatus(status: UserStatus) {
  switch (status) {
    case "active":
      console.log("User is active");
      break;
    case "inactive":
      console.log("User is inactive");
      break;
    case "banned":
      console.log("User is banned");
      break;
    default:
      // 強(qiáng)制類型檢查是否已全面覆蓋所有情況
      const exhaustiveCheck: never = status;
      throw new Error(`Unhandled status: ${status}`);
  }
}

在 switch 語(yǔ)句的 default 分支中,我們定義了一個(gè) exhaustiveCheck 變量,類型為 never,并將 status 賦值給它。TypeScript 會(huì)在編譯時(shí)檢查,如果 status 不是 never 類型(即還存在未處理的情況),會(huì)觸發(fā)編譯錯(cuò)誤。

比如:未來(lái)在 UserStatus 中添加新的狀態(tài),例如 suspended,但沒(méi)有在 switch 語(yǔ)句中處理它,TypeScript 會(huì)報(bào)錯(cuò):

type UserStatus = 'active' | 'inactive' | 'banned' | 'suspended';

這種方式確保了新增狀態(tài)時(shí)的類型全面覆蓋,有助于維護(hù)代碼的健壯性和可讀性。

2、類型收窄的輔助:never 可以幫助 TS 判斷哪些代碼路徑無(wú)法訪問(wèn),從而優(yōu)化代碼檢查和類型收窄。

??:

// 在類型約束中,表示參數(shù)的類型不是某一個(gè)類型,比如:類型除了 number 之外都OK
type MyExclude<T, U> = T extends U ? never : T;
// function isNumber<T>(x: T extends number ? never : T) {}
function isNumber<T>(x: MyExclude<T, number>) {}
isNumber('123')
isNumber({})
isNumber(true)
isNumber(111)

3. 判斷 never 類型

在 TypeScript 中,當(dāng)使用條件類型 T extends never ? true : false 直接判斷 never 類型時(shí),得到 never 而不是 true。

1、為什么會(huì)這樣呢?

在條件類型中,當(dāng) T 是聯(lián)合類型時(shí),TypeScript 會(huì)對(duì) T 中的每個(gè)成員獨(dú)立應(yīng)用條件(即分配式條件類型)。但是 never 是一個(gè)“空的聯(lián)合類型”,沒(méi)有成員,因此 TypeScript 無(wú)法真正地應(yīng)用條件,它直接返回 never。

2、分配式條件類型

條件類型在遇到聯(lián)合類型時(shí),會(huì)逐一分配并進(jìn)行條件判斷,即所謂的分配式。不過(guò),never 并不屬于任何集合,因此在分配式條件下,會(huì)直接返回 never,而不會(huì)像其他類型一樣返回 true 或 false。

3、解決方法:

為了讓條件類型正確地判斷 never,可以將 T 包裝在元組中,以防止分配式條件類型的影響:

type IsNever<T> = [T] extends [never] ? true : false;

這樣會(huì)強(qiáng)制 T 作為一個(gè)整體進(jìn)行判斷,因此 never 就會(huì)得到 true。 

??:

type Test1 = IsNever<never>; // true
type Test2 = IsNever<string>; // false
type Test3 = IsNever<undefined>; // false
type Test4 = IsNever<any>; // false

4. 注意事項(xiàng)

1、避免濫用:never 僅適用于不可能有結(jié)果的情況;如果函數(shù)可能有返回值,使用 void 更合適。

2、和 void 的區(qū)別:void 表示函數(shù)無(wú)返回值,但仍會(huì)返回 undefined,而 never 表示函數(shù)根本不會(huì)返回。

3、使用在類型收窄中:never 可以幫助 TypeScript 識(shí)別和優(yōu)化代碼分支,若分支邏輯不全,編譯器會(huì)警告。

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

相關(guān)文章

最新評(píng)論

青河县| 仁化县| 梁平县| 凉城县| 建宁县| 于田县| 玉龙| 伊宁市| 新疆| 海南省| 彝良县| 丰城市| 东海县| 固安县| 玛沁县| 高密市| 扎鲁特旗| 曲松县| 青岛市| 左权县| 通渭县| 许昌县| 成安县| 阳谷县| 临泽县| 金山区| 郴州市| 隆子县| 理塘县| 家居| 突泉县| 观塘区| 务川| 寿光市| 化德县| 双江| 夏津县| 五台县| 白山市| 伊金霍洛旗| 封开县|