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

TypeScript中never類型的妙用詳解

 更新時間:2023年11月21日 10:52:28   作者:子辰Web草廬  
TypeScript?是一種靜態(tài)類型的編程語言,它可以讓我們在編寫?JavaScript?代碼時,提前發(fā)現(xiàn)并避免一些潛在的錯誤,本文主要為大家介紹了TypeScript中never類型的妙用,感興趣的可以了解下

TypeScript 是一種靜態(tài)類型的編程語言,它可以讓我們在編寫 JavaScript 代碼時,提前發(fā)現(xiàn)并避免一些潛在的錯誤。

但是,有時候我們在修改類型時,可能會忘記修改一些相關(guān)的代碼,導(dǎo)致類型不匹配或者缺少分支處理等問題。

有沒有一種方法,可以讓我們在修改類型時更加輕松和精確呢?

答案是肯定的!

我是渡一子辰老師,今天我來向你介紹一個重要的類型——never 類型。

它是 TypeScript 中最小的類型,它表示一個永遠(yuǎn)不會出現(xiàn)的值。

子辰還將告訴你如何利用 never 類型來確保類型約束的精確性,避免在類型修改過程中導(dǎo)致的錯誤。

什么是 never 類型

在 TypeScript 中,never 類型表示一個永遠(yuǎn)不會出現(xiàn)的值。

它是所有類型的子類型,也就是說,任何類型都可以賦值給 never 類型,但是 never 類型不能賦值給任何類型,當(dāng)然除了它自己。

never 類型有什么用呢?我們可以用它來表示一些永遠(yuǎn)不會發(fā)生的情況,比如:

  • 拋出異常的函數(shù)
  • 死循環(huán)的函數(shù)
  • 永遠(yuǎn)不會進(jìn)入的分支

例如:

// 拋出異常的函數(shù)
function error(message: string): never {
  throw new Error(message);
}

// 死循環(huán)的函數(shù)
function loop(): never {
  while (true) {}
}

// 永遠(yuǎn)不會進(jìn)入的分支
function foo(x: string | number) {
  if (typeof x === "string") {
  // do something
  } else if (typeof x === "number") {
  // do something else
  } else {
  // x is never
  const n: never = x;
  }
}

在上面的例子中,error 函數(shù)和 loop 函數(shù)都永遠(yuǎn)不會返回任何值,所以它們的返回類型是 never 。

foo 函數(shù)中,如果 x 是 string 或者 number ,就會進(jìn)入相應(yīng)的分支處理;如果 x 不是這兩種類型,就會進(jìn)入最后一個分支,但是這個分支永遠(yuǎn)不會進(jìn)入,因?yàn)?x 的類型已經(jīng)被收縮為 never 了。

所以我們可以用 never 類型來標(biāo)記這個分支,并且把 x 賦值給一個 never 類型的變量 n ,這樣就可以確保這個分支永遠(yuǎn)不會被執(zhí)行。

never 的妙用

我們已經(jīng)知道了 never 類型可以表示一些永遠(yuǎn)不會發(fā)生的情況,那么我們?nèi)绾卫盟鼇泶_保類型約束的精確性呢?

我們來看一個例子。

假設(shè)我們要封裝一個 Ajax 請求的方法。

// 定義一個類型
type Method = 'GET' | 'POST'
// 封裝一個 Ajax 請求的方法,為兩個參數(shù)約束類型
function request(method: Method, url: string) { }

可以看到方法已經(jīng)寫好了,并且在調(diào)用 request 時也有提示了。

那么我們再來寫函數(shù)里邊的東西。

type Method = 'GET' | 'POST'
function request(method: Method, url: string) {
  // 因?yàn)橛卸喾N請求類型,我們這里用 switch
  // 每一個類型隨便給它返回一個值僅做模擬
  switch (method) {
    case "GET":
      return "get"
    case "POST":
      return "post"
    default:
      return 'default'
  }
}

可以看到函數(shù)里邊用 switch 來根據(jù)不同的請求類型返回不同的值。

但是這里有一個問題:我們定義了 Method 類型只有兩種可能:GET 和 POST ,那么為什么還要寫 default 分支呢?因?yàn)檫@個分支永遠(yuǎn)不會進(jìn)入!

我們看一下 default 分支里是什么類型。

可以看到,它變成了 never 類型,這就得益于 TS 里的類型收縮,就是 TS 他會分析你的分支,根據(jù)你分支的條件來對類型做一個相應(yīng)的收縮。

比如在下圖的分支里,就被收縮成了 GET 值,它就不在是聯(lián)合類型了。

那么在 default 里由于這個分支永遠(yuǎn)不會進(jìn)來,所以說它就用類型 never 來表示了。

那么這個對我們實(shí)際開發(fā)到底有什么用呢?

我們考慮這么一種情況,如果我們不寫 default 分支,我們對 Method 類型擴(kuò)展了其他可能性,比如:PUT 或者 DELETE 等。

你看,在下圖中我們加了一個 PUT 類型以后,并沒有報錯,你壓根就不知道這個函數(shù)里還應(yīng)該加一個 PUT 分支。

當(dāng)你的代碼寫多了,然后再非常繁雜的代碼里邊,改了一個類型,你就很難知道,你這個改動會影響到哪些地方。

就是其他地方的代碼到底哪些地方會做相應(yīng)的修改,你是很難知道的。

當(dāng)然這個代碼很少,一眼就能看出來,那如果是上萬行代碼呢?因?yàn)?TS 往往是在大型項(xiàng)目工程中使用的,幾萬行代碼你還能清楚的知道嗎?

這個時候呢,我們就可以借助 never 了,來看下怎么做。

type Method = 'GET' | 'POST'
function request(method: Method, url: string) {
  switch (method) {
    case "GET":
      return "get"
    case "POST":
      return "post"
    default:
      const n: never = method;
      return n
  }
}

我們回到最初的情況,我們就加一個 default 分支,分支里定一個變量 n,標(biāo)注為 never 類型,然后吧 method 賦值給它,然后返回這個 n。

它不會影響代碼的執(zhí)行,因?yàn)檫@個分支永遠(yuǎn)進(jìn)不來。

而且這個賦值也是安全的,因?yàn)楝F(xiàn)在 default 分支里的 method 是 never 類型,never 是可以賦值給 never 的,但是其他類型就不能賦值給 never 了。

接下來我們就可以放心大膽的去修改類型了。

當(dāng)我們加了一個 PUT 以后,就會發(fā)現(xiàn)報錯了,因?yàn)?TS 的類型收縮,它知道分支里還有一種情況,就是 PUT,那么這種類型是不能賦值給 never 的,于是這里就報錯了。

這樣子呢,你就非常清楚這個地方還需要去增加一個分支,要做相應(yīng)的修改。

比如說有很多這個函數(shù),根據(jù)報錯,就能很清楚的知道哪些地方要做修改了。

這是 never 類型在 TS 里邊非常常見的一種做法,這種做法在大型項(xiàng)目里邊及其有用。

總結(jié)

本文主要就是幫助你理解 never 類型在 TypeScript 中的應(yīng)用及其優(yōu)勢。

在 TypeScript 中,never 類型表示一個永遠(yuǎn)不會出現(xiàn)的值,它可以在類型收縮時進(jìn)行自動推導(dǎo),使代碼更加穩(wěn)定可靠。

在函數(shù)中,我們可以利用 never 類型來確保類型約束的精確性,避免了在類型修改過程中導(dǎo)致的錯誤。特別是在大型項(xiàng)目中,never 類型可以幫助我們更好地維護(hù)代碼,減少因修改類型而導(dǎo)致代碼修改和錯誤的風(fēng)險。

例如,我們文章中的例子,通過分析代碼分支,我們可以使用 never 類型來標(biāo)記永遠(yuǎn)不會進(jìn)入的分支。這樣一來,我們在以對類型進(jìn)行擴(kuò)展時,就可以很快地知道在哪些地方需要進(jìn)行相應(yīng)的修改,從而提高代碼的可維護(hù)性和穩(wěn)定性。

在項(xiàng)目開發(fā)中,特別是大型項(xiàng)目開發(fā)中,掌握使用 never 類型的技巧,可以讓同學(xué)們更加高效、精準(zhǔn)地編寫出高質(zhì)量的代碼。

以上就是TypeScript中never類型的妙用詳解的詳細(xì)內(nèi)容,更多關(guān)于TypeScript never類型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

齐河县| 涡阳县| 白水县| 孝义市| 德清县| 昔阳县| 沭阳县| 衡水市| 文化| 龙游县| 土默特右旗| 巴楚县| 襄垣县| 文山县| 洛宁县| 郁南县| 鄄城县| 平陆县| 祁阳县| 桓仁| 龙井市| 贵州省| 聂荣县| 长海县| 玉山县| 叶城县| 德昌县| 简阳市| 理塘县| 焦作市| 涟源市| 福清市| 西藏| 湖口县| 淄博市| 平定县| 江源县| 彩票| 浙江省| 宝兴县| 清河县|