当前位置: 首页 > news >正文

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.xdnf.cn/news/1378909.html

相关文章:

  • C++ RAII 浅谈
  • 从Cgroups精准调控到LXC容器全流程操作​:用pidstat/stress测试Cgroups限流,手把手玩转Ubuntu LXC容器全流程​
  • 冒泡排序算法详解(python code)
  • Two Knights (数学)
  • 大模型微调示例三之Llama-Factory_Lora
  • 【C++详解】用哈希表封装实现myunordered_map和 myunordered_set
  • Kubernetes一Prometheus概述
  • [linux仓库]透视文件IO:从C库函数的‘表象’到系统调用的‘本质’
  • [调试][实现][原理]用Golang实现建议断点调试器
  • 获取小红书某个用户列表
  • 【LeetCode 热题 100】32. 最长有效括号——(解法二)动态规划
  • 集成电路学习:什么是TensorFlow
  • AI实时故障诊断系统(实时采集信号)
  • Python 正则表达式完全指南:从基础语法到实战案例
  • 【从0带做】基于Springboot3+Vue3的呱呱同城(微服务项目)
  • 实现微信小程序的UniApp相机组件:拍照、录像与双指缩放
  • ARM相关的基础概念和寄存器
  • PCIe 5.0 SSD连续读写缓存用完速度会骤降吗?
  • 2024年09月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 帕累托优化:多目标决策的智慧与艺术
  • 【重学 MySQL】九十二、 MySQL8 密码强度评估与配置指南
  • 关于virtual camera
  • 【C++游记】模板升级
  • 【半导体制造流程概述】
  • windows 子系统 wsl 命令的用法
  • vue3 字符 居中显示
  • SpringBoot整合Redis:从入门到实战的完整指南
  • 关于DTO、DO、BO、VO
  • 工业 DCS 全面科普:从入门到 AI 赋能的未来
  • mybatis-plus实现苍穹外卖项目-分类操作,不定期更新-day2