TypeScript:never類型

? ? never類型是TypeScript中最特殊的類型之一,它表示永遠不會發生的值。作為專業前端工程師,理解never類型對于編寫類型安全的代碼至關重要。

1.?never類型的核心概念

  • 定義never類型表示永遠不會出現的值,常見于:

    • 拋出錯誤的函數(函數無法正常返回)

    • 死循環函數(函數永不結束)

    • 類型收窄后不可能存在的分支

  • 關鍵特性

    • never是所有類型的子類型(可賦值給任意類型)

    • never本身外,沒有任何類型可賦值給never

  • 基礎示例:

// 1. 拋出錯誤的函數
function throwError(msg: string): never {throw new Error(msg);
}// 2. 死循環
function infiniteLoop(): never {while (true) {}
}

2.?前端開發中的典型應用場景

  • 類型收窄的窮盡檢查
    在聯合類型處理中,確保所有分支被覆蓋(如Redux reducer):

type Action = | { type: 'FETCH_START' }| { type: 'FETCH_SUCCESS', data: string[] }| { type: 'FETCH_FAIL', error: Error };function reducer(state: State, action: Action): State {switch (action.type) {case 'FETCH_START': return { ...state, loading: true };case 'FETCH_SUCCESS':return { loading: false, data: action.data };case 'FETCH_FAIL':return { loading: false, error: action.error };default:// 類型收窄后,action應為neverconst _exhaustiveCheck: never = action;return state;}
}

若新增FETCH_RETRY類型但未處理,default分支會因never類型報錯(TS2345)

  • 條件類型過濾
    在類型工具中排除特定類型:

// 剔除null和undefined
type NonNullable<T> = T extends null | undefined ? never : T;// 效果: string | number
type Cleaned = NonNullable<string | number | null>;
  • 防御性編程
    標記不應到達的代碼分支(如React自定義hook):

    function useCustomHook(val: string | number) {if (typeof val === 'string') {// 處理字符串} else if (typeof val === 'number') {// 處理數字} else {// 標記不可能的分支const unreachable: never = val;throwError('Unexpected value'); // 調用never返回函數}
    }
    

3.?never與其他類型的關系

類型特性對比典型用例
never表示"不可能發生"的值錯誤處理/窮盡檢查
void表示無返回值(返回undefined)無返回值的函數
unknown頂級類型,表示任意值但需類型斷言第三方庫數據接收
any放棄類型檢查(禁用TS安全特性)兼容JS舊代碼(應避免使用)

4.?優缺點與最佳實踐

  • 優點

    • 增強類型安全:強制處理所有可能的分支(聯合類型)

    • 自文檔化:明確標記不可達代碼

    • 高級類型工具:實現類型邏輯過濾(如Exclude<T, U>

  • 缺點

    • 過度使用會增加代碼復雜度

    • 新手易誤解其設計意圖

  • 前端實踐建議

    1. 在Redux/Vuex的reducer中必用窮盡檢查

    2. 自定義類型工具時優先使用never過濾無效類型

    3. 避免在基礎業務邏輯中濫用,保持代碼簡潔性

5.?總結

? ? never類型是TypeScript類型系統的基石之一,它代表"不可能存在"的值的概念。在前端開發中,其主要價值在于:

  • 實現編譯時的窮盡性檢查,避免分支遺漏導致的運行時錯誤

  • 構建高級類型工具(如Exclude, NonNullable

  • 增強防御性編程能力,標記不應執行的代碼路徑

雖然日常業務代碼中直接使用頻率較低,但在構建可維護的大型前端項目(尤其是狀態管理庫和工具類型)時,never是確保類型安全的終極防線。推薦在關鍵邏輯處理層(如reducer、parser)中積極采用,但在簡單組件中謹慎使用以保持代碼可讀性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94921.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖數據庫neo4j的安裝

安裝JDK Neo4j是基于Java的圖形數據庫&#xff0c;運行Neo4j需要啟動JVM進程&#xff0c;因此必須安裝JAVA SE的JDK。從Oracle官方網站下載 Java SE JDK&#xff0c;我的的版本是JDK8。 安裝Neo4j 官網下載最新版本Neo4j 我下的是社區版的 Neo4j應用程序有如下主要的目錄結構…

汽車診斷服務(UDS——0x27服務解析)

目錄 1、服務概述 2、工作原理 3、常用的應用場景 4、子功能 5、請求與響應格式 5、1服務請求 5、2服務肯定響應 5、3服務否定響應 6、延時機制 1、服務概述 該服務對零部件中部分加密的服務進行解密工作安全訪問的概念使用“種子”和“密鑰”來實現 參數描述種子4字…

波蘭密碼破譯機bomba:二戰密碼戰的隱形功臣

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 從數學原理到機械奇跡&#xff0c;破解enigma的早期利器 ? 1. bomba概…

【RAGFlow代碼詳解-30】構建系統和 CI/CD

Docker 構建系統 RAGFlow 使用主 Dockerfile 1-214 中定義的復雜多階段 Docker 構建過程&#xff0c;該過程創建應用程序的完整和精簡變體。 多階段構建架構Docker 構建過程 構建過程由 Dockerfile 2-214 中 定義的三個主要階段組成&#xff1a;基礎階段 &#xff08; Dockerfi…

rust語言 (1.88) egui (0.32.1) 學習筆記(逐行注釋)(十七)設置主題

設置主題set_visuals ctx.set_visuals(Visuals::dark()); 設置暗色主題ctx.set_visuals(Visuals::light()); 設置亮色主題 fn main() -> eframe::Result<()> {// 配置原生窗口參數let options eframe::NativeOptions::default();eframe::run_simple_native("主題…

Linux入門教程 第十五章 Linux 系統調優工具

文章目錄一、系統調優概述與 CPU 負載查看1.使用 uptime 查看系統負載2.使用 top 按 CPU 使用率排序3.使用 ps 查看 CPU 使用最多的進程4.使用 mpstat 查看 CPU 詳細狀態一、查看內存運行狀態1.使用 free 查看內存使用2.查看 /proc/meminfo 獲取詳細內存信息3.使用 top 按內存使…

【Docker基礎】Docker-compose進階配置:健康檢查與服務就緒

目錄 引言 1 Docker健康檢查基礎概念 1.1 什么是健康檢查 1.2 健康檢查的狀態 2 healthcheck配置詳解 2.1 基本語法 2.2 配置參數解釋 2.3 健康檢查命令的編寫 2.4 健康檢查的工作流程 3 服務依賴與健康檢查 3.1 depends_on的基本用法 3.2 結合健康檢查的依賴 3.3…

Redis大Key處理流程與注意事項

概述 Redis大Key問題是在生產環境中經常遇到的技術挑戰&#xff0c;它可能導致內存占用過高、網絡延遲增加、阻塞其他操作等嚴重問題。本文將深入探討Redis大Key的識別、處理流程以及相關注意事項。 什么是Redis大Key 定義標準 String類型: 單個Key的Value超過10KBHash類型: 單…

領悟8種常見的設計模式

很多 Java 初學者覺得設計模式 “抽象難學”&#xff0c;其實是沒抓住核心邏輯 —— 設計模式不是 “炫技代碼”&#xff0c;而是前輩們總結的 “解決高頻復雜問題的通用思路”&#xff0c;好吧&#xff0c;你可以過一遍了解這些大概是個什么東西不求我們能夠完全理解&#xff…

復雜BI報表SQL

復雜SQL 一行多個人員&#xff0c;平均瓜分總產量。 -- 西寧硅料三期 with b as ( select(row_number() OVER(PARTITION BY t1.tool ORDER BY t1.tool ) - 1) AS help_topic_id from((select1 AS tool union allselect1 AS tool union allselect1 AS tool union allselect1 AS …

bin log 和 redo log有什么區別

問題bin log 和 redo log有什么區別我的回答首先&#xff0c;這兩種日志的作用不同。redo log是InnoDB引擎特有的&#xff0c;主要用于崩潰恢復&#xff0c;保證事務的持久性。而bin log是MySQL服務層的日志&#xff0c;主要用于主從復制和數據恢復。從層次上看&#xff0c;red…

導入文件允許合并表格

本來呢&#xff0c;已經有幾年沒咋寫博客了&#xff0c;但是好像網上沒什么好的合并導入可以抄的&#xff0c;周末加班了一天弄出來了&#xff0c;想一想也不算造輪子&#xff0c;可以露一手出來&#xff0c;最近也挺喜歡寫注釋的&#xff0c;應該方便大家抄的public class Tra…

WebIDEPLOY 技術驅動櫻桃溯源管理系統的價值重塑與落地實踐—— 以櫻桃溯源管理系統構建產業信任體系的路徑探索

一、WebIDEPLOY 技術支撐下的櫻桃溯源系統核心架構櫻桃種植從開花到銷售的全流程數據記錄&#xff0c;需要兼顧專業性與易操作性&#xff0c;WebIDEPLOY 技術以 “零代碼降低門檻、云原生優化成本” 的特性&#xff0c;成為連接數字工具與櫻桃種植的關鍵紐帶。系統核心架構圍繞…

零知開源——基于STM32F407VET6實現ULN2003AN驅動28BYJ-48步進電機控制系統

?零知IDE 是一個真正屬于國人自己的開源軟件平臺&#xff0c;在開發效率上超越了Arduino平臺并且更加容易上手&#xff0c;大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼&#xff0c;讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品&am…

如何多個手機設備的實現不同公網IP

為了避免多個手機設備使用相同的公網IP地址導致平臺檢測關聯&#xff0c;可以通過以下方法實現不同公網IP的分配和管理. 一、移動網絡&#xff08;SIM 卡&#xff09;方案 1.移動數據與Wi-Fi切換&#xff1a;通過切換移動數據和不同Wi-Fi網絡&#xff08;如家庭Wi-Fi、公共Wi-F…

沙箱操作指南

這是一份通用且詳細的沙箱操作指南。沙箱(Sandbox)是一種安全隔離環境,常用于測試未經驗證的代碼、軟件、文件或訪問可疑網址,而不會對真實系統造成危害。 本指南將分為以下幾個部分: 沙箱是什么? 為什么需要使用沙箱? 如何使用沙箱?(三種主要類型) 最佳實踐與注意事…

【數字IC后端】引導時鐘樹CTS的生成方向之anchor driver

如何控制數字IC后端CTS的生成方向&#xff1f;我們可以引入anchor driver來實現引導。景芯12nm車規APR實戰中&#xff0c;我們可以看到&#xff0c;絕大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1這個mux&#xff0c;…

「Java EE開發指南」如何使用MyEclipse啟用自動JSP驗證?

自動JSP驗證可以在兩種情況下啟用&#xff0c;在本文中您將學習如何正確使用它。 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 您可以在保存JSP編輯器的內容或執行“Clean”操作時啟用自動JSP驗證。要進行正確的驗證&#xff0c;必須使用完整的JDK JVM啟動MyEcl…

leetcode_73 矩陣置零

1. 題意 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 2. 題解 想不到O(1)的空間復雜度的做法&#xff0c; 只有抄抄題解這樣子才能維持的了生活。 2.1 暴力 維護兩個標記數組&#xff0c;分…

優雅地實現ChatGPT式的打字機效果:Spring Boot 流式響應

01 引言 之前專門介紹過流式響應的數據的接收、發送以及使用SSE由服務端推送數據的文章&#xff0c;但是要求前端必須使用EventSource訂閱實現。 有沒有通過直接通過瀏覽器訪問或者Fetch API直接調用的方式呢&#xff1f;效果還能和ChatGPT一樣&#xff0c;實現打字機的效果呢&…