成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

理解 TypeScript 的 Never 類型

開發 前端
對于很多人來說,TypeScript 中的 never 類型比較神秘,它有什么作用?什么時候應該使用它?

今天我們就來深入討論 never 類型,并介紹可能遇到的情況。

1. never 的特點

TypeScript使用never關鍵字來表示邏輯上不應該發生的情況和控制流。實際上,我們在工作中不會常遇到使用 never 的情況,但是還是很有必要了解它是如何有助于 TypeScript 的類型安全的。

官方文檔對 never 的描述:

never 類型是任何類型的子類型,也可以賦值給任何類型;但是,沒有類型是never的子類型或可以賦值給never類型(never 本身除外)。

也就是說,可以將never類型的變量分配給任何其他變量,但不能將其他變量分配給never。下面來看一個例子:

const throwErrorFunc = () => { throw new Error("error") };
let neverVar: never = throwErrorFunc()
const myString = ""
const myInt:number = neverVar;
neverVar = myString // Type 'string' is not assignable to type 'never'

我們可以暫時忽略 throwErrorFunc 的功能,只需知道,這樣可以初始化類型為 never 的變量。

從上面的代碼中可以看到,可以將 never 類型的變量 neverVar 分配給 number 類型的變量myInt。但是,不能將 string 類型的 myString 變量分配給 neverVar,這樣分配會報錯。這也就是上面所說的,不能將任何其他類型的變量分配給 never,即使是 any 類型的變量。

2. 函數中的 never

TypeScript 使用 never 作為那些無法達到的終點的函數的返回值類型。主要有兩種情況:

函數拋出一個錯誤異常。

函數包含一個無限循環。

來看上面提到的 throwErrorFunc 函數,TypeScript 就會推斷此函數的返回類型為 never:

const throwErrorFunc = () => {
throw new Error("error")
};

另一種情況就是如果有一個一直為真的表達式產生了無限循環,它沒有中斷或者返回語句。TypeScript 就會推斷此函數的返回類型為 never:

const output = () => {
while (true) {
console.log("循環");
}
};

3. never 和 void 的區別

那什么是 void 類型呢?我們有 void 為什么還要 never 類型呢?

never 和 void 的主要區別在于,void 類型的值可以是 undefined 或 null。

TypeScript 對不返回任何內容的函數使用 void。如果沒有為函數指定返回類型,并且在代碼中沒有返回任何內容,TypeScript 將推斷其返回類型為void。在TypeScript中,不返回任何內容的 void 函數實際上返回的是 undefined。

來看一個例子:

const functionWithVoidReturnType = () => {}; 
console.log(functionWithVoidReturnType()); // undefined

這里,TypeScript 會推斷此函數的返回類型為 void。我們通常會忽略 void 函數的返回值。

這里需要注意:根據 never 類型的特征,我們不能將 void 指定給 never:

const myVoidFunction = () => {}
neverVar = myVoidFunction() // ERROR: Type 'never' is not assignable to type 'void'

4. never 作為可變類型守

如果變量被一個永遠不可能為 true 的類型保護縮小范圍,那么變量就可能成為 never類型。通常,這表明條件邏輯存在缺陷。

來看下面的例子:

const unExpectedResult = (myParam: "this" | "that") => {
if (myParam === "this") {

} else if (myParam === "that") {

} else {
console.log({ myParam })
}
}


在這個例子中,當函數執行到 console.log({ myParam }) 時,myParam 的類型將為 never。

這是因為我們將 myParam 的類型設置為了 this 或 that。由于 TypeScript 認為 myParam 類型屬于兩個類型之一,所以從邏輯上講,第三個 else 語句永遠不會出現。所以TypeScript 就會將參數類型設置為 never。

5. 詳盡檢查

在實踐中可能會用到 never 的一個地方就是進行詳細的檢查。這有助于確保我們處理了代碼中的每個邊緣情況。

下面來看看如何使用詳盡檢查為 switch 語句添加更好的類型安全性:

type Animal = "cat" | "dog" | "bird"

const shouldNotHappen = (animal: never) => {
throw new Error("error")
}

const myPicker = (pet: Animal) => {
switch(pet) {
case "cat": {
// ...
return
}
case "dog": {
// ...
return
}
}
return shouldNotHappen(pet)
}

當添加 「return shouldNotHappen(pet)」時,會看到一個錯誤提示:

這里的錯誤提示告訴我們,忘記包含在 switch 語句中的情況。這是一種獲得編譯時安全性并確保處理 switch 語句中的所有情況的巧妙模式。

6. 結論如你所見,TypeScript 中的 never 類型在特定情況很有用。大多數情況下,never 表明代碼存在缺陷。

但在某些情況下,例如詳盡檢查,它可以成為幫助編寫更安全的 TypeScript 代碼的好工具。


責任編輯:武曉燕 來源: 前端充電寶
相關推薦

2022-11-30 07:17:53

2024-11-05 09:11:09

TypeScript開發者代碼

2021-07-27 06:06:34

TypeScript語言運算符

2024-11-11 08:32:00

2024-09-30 08:34:01

TypeScript可讀性安全性

2024-05-11 10:19:31

TypeScript類型接口

2022-04-11 08:42:09

TypeScript子類型定義

2021-08-18 07:56:05

Typescript類型本質

2022-08-08 09:00:42

TypeScript映射類型

2022-04-18 20:12:03

TypeScript靜態類型JavaScrip

2024-06-13 09:05:12

2021-09-09 07:21:26

TypeScript 高級類型

2023-03-28 09:56:47

TypeScripJavaScrip

2022-09-20 14:43:55

TypeScript類型體操

2025-01-20 00:13:19

TypeScript操作符數據類型

2022-03-24 09:44:54

TypeScriptSOLID

2021-06-09 07:55:19

Typescript類型檢查

2022-05-04 09:02:41

TypeScript類型工具

2009-08-27 16:39:26

C# String類型

2020-09-15 08:35:57

TypeScript JavaScript類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩中文视频 | 日韩精品成人av | 精品一区在线 | 欧美一级片在线看 | 日韩蜜桃视频 | 91黄在线观看 | 日韩一级免费电影 | 麻豆天堂| 成人免费在线观看 | 国产精品一区二区在线 | 91国内视频在线 | 亚洲欧美激情国产综合久久久 | 正在播放国产精品 | 久久久久九九九女人毛片 | 久久久毛片 | 午夜视频免费在线观看 | 色播视频在线观看 | 亚洲日韩欧美一区二区在线 | 91在线视频观看免费 | 狠狠久久 | 国产精品久久久久久久免费观看 | 日本三级电影在线看 | 国产精品v | 中文一区二区 | 欧美一区二区免费视频 | 国产激情精品视频 | 亚洲一区电影 | 亚洲午夜精品在线观看 | 国产精品一区2区 | 欧美一二三四成人免费视频 | 青青草一区 | 久久免费大片 | 亚洲传媒在线 | 麻豆av网| 中文字幕日本一区二区 | 一区二区三区国产好 | 一区二区三区欧美在线观看 | 精品三区 | 国产精品.xx视频.xxtv | 欧美日韩久 | 综合成人在线 |