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;实现打字机的效果呢&…