TypeScript中的never应用场景
创始人
2024-03-12 20:38:46
0

一、了解never类型

ts的文档

在TypeScript中never就是Bottom Type,意味着一个不表示任何类型的类型,never不会是任何值,可能会被推断出来,或者自己定义避免出现逻辑上的异常

比如一个函数中是一个死循环或异常,这个函数则不会返回任何东西,那么写返回类型的话,写void或者其他的都不合适,那我们就可以使用never

二、基本类型never使用

never单独使用的场景比较少,一般在封装工具时用的多。当在封装工具时,逻辑没有处理完,never就会报错。相当于是一种逻辑判断,当处理完成后则不会报错,更严谨逻辑判断

2.1 一个简单的例子

function showMessage(info:string | number){console.log(info)
}
showMessage("字符串")
showMessage(123);

代码看起来没什么问题,假设某天这个函数又多了个对象参数

showMessage(info:string | number | object)

很常见的场景就是我们希望,将所有的参数类型都能匹配到,对每个联合类型进行特殊处理。在上面代码中,如果忘记处理了object类型情况,Ts也不会报错。

那么,要怎么在漏处理类型的时候抛出错误呢?我们能在每一个 default 的 语法块中将变量的类型收窄到对应的值。

function showMessage(info:string | number | object){switch(typeof info){case "string":console.log(info)break;case "number":console.log(info)break;default://....}
}

在最后的 default 语句块中,如果我们还使用这个变量,那么它就会被智能推导为 boolean 类型。这肯定不是我们想看到的,它都走到兜底语句块了还有未收窄过的类型。所以我们简单粗暴的把它赋值为 never

function showMessage(info:string | number | object){switch(typeof info){case "string":console.log(info)break;case "number":console.log(info)break;default:const Check:never = info;//Type 'object' is not assignable to type 'never'}
}

报错了,不能将obj赋值给never,我们再加个处理Object的case

function showMessage(info:string | number | object){switch(typeof info){case "string":console.log(info)break;case "number":console.log(info)break;case "object":console.log(info);break;default:const Check:never = info;//....}
}

现在就没问题了,因为在穷举完所有类型分支后,info的类型当然就也是 never 啦。这样做只是从 TypeScript 类型层面避免了遗漏,为了安全起见,我们可以在 default 兜底语句中抛出一个错误:

const Check:never = info;
throw new Error(`Unknown input type: ${Check}`);

相关内容

热门资讯

【Linux】supervis... 1、简介 Supervisor是一个客户端/服务器系统,它允许用户控制类unix操作系统上的许多进程...
医疗器械免临床申请 仪器免临床的申请主要是基于《医疗器械注册与备案管理办法》47号令 中的第三十四条 第三十四条  有下...
我的2022——从外地回到老家... 0. 引言 转眼间已经到了2023年,从2021年回到家乡后已经过去了2年了。这两年的...
软件测试技术之利用 Jest ... 在本文中我们会具体聊聊如何用 Jest 为 React 组件编写单元测试。 首先我们要明确的一点&#...
互联网产品神话消失:疯狂下架,... 对于各互联网大厂而言,2022年注定是难忘的一年,腾讯CEO马化腾、百度...
Java学习(88)Java集... Java集合——案例:商品信息管理(HashMap增删改查)...
C#窗体编程(windows ... C#窗体编程(windows forms)禁止窗口最大化,...
【手写 Vue2.x 源码】第... 一,前言 上篇,主要介绍了依赖收集过程中 dep 和 watcher 关...
mysql导入导出 一、MySQL导出数据库1、导出数据和表结构命令格式:mysqldump -u用户名 ...
核心显卡和独立显卡的区别 作为计算机的基础组成部分之一,显卡性能的强度将直接我们经常能在计算机中看到两种显卡&#...