TS中never类型的妙用

        在 TypeScript(TS)中,never 类型是一个特殊的类型,它表示的是那些永不存在的值的类型。这听起来可能有点抽象,但实际上它在一些场景中非常有用。以下是 never 类型在 TypeScript 中的一些妙用:

  1. 表示函数永远不会返回
    当你有一个函数,它因为某些原因(如抛出一个错误)而永远不会正常返回时,你可以将其返回类型设置为 never。这有助于 TypeScript 的类型检查器更好地推断代码中的其他部分。

    function error(message: string): never {  throw new Error(message);  
    }
     

    注意,如果你试图将这个函数的结果赋值给一个变量或将其作为其他函数的返回值,TypeScript 会报错,因为它知道这个函数永远不会返回。

  2. 表示类型守卫的排他性
    类型守卫是 TypeScript 中的一个功能,它允许你在运行时检查一个值是否属于某个类型,并相应地缩小其类型。当你知道某个类型守卫能够覆盖所有可能的输入时,你可以将其返回类型设置为 never,以表示如果条件不满足,代码将永远不会到达那个点。

    function isNumber(x: any): x is number {  return typeof x === 'number';  
    }  function isString(x: any): x is string {  return typeof x === 'string';  
    }  function assertNever(x: never): never {  throw new Error(`Unexpected object: ${x}`);  
    }  function classify(x: any) {  if (isNumber(x)) {  return 'number';  } else if (isString(x)) {  return 'string';  } else {  // 如果我们确信上面的条件已经覆盖了所有可能的输入,  // 那么这里的代码永远不会执行,所以我们可以使用 never 类型。  return assertNever(x);  }  
    }
  3. 在递归函数中表示基本情况
    当使用递归函数时,你可能有一个基本情况,当达到该情况时,函数不再递归调用自身。在这种情况下,将基本情况的返回类型设置为 never 可以帮助 TypeScript 确保所有可能的输入都被正确处理。

    function factorial(n: number): number {  if (n <= 1) {  return 1; // 这里不是 never,因为我们返回了一个数字  } else {  return n * factorial(n - 1); // 递归调用  }  
    }  // 假设我们有一个永远不会达到的情况(只是为了示例)  
    function unreachable(x: never): never {  throw new Error('This should never happen');  
    }  // 错误的示例,只是为了说明  
    function factorialWrong(n: number): number {  if (n <= 0) {  // 这里应该返回一个数字,但我们假设它永远不会发生  return unreachable(n); // 这里 n 实际上是 number,不是 never  } else {  return n * factorialWrong(n - 1);  }  
    }

    注意,在实际情况中,上面的 factorialWrong 函数中的 unreachable 调用是错误的,因为 n 是 number 类型而不是 never 类型。这只是一个为了说明 never 类型的用法而设计的假设示例。

  4. 在条件类型中排除类型
    在条件类型中,你可以使用 never 来排除某些类型。这在构建复杂的类型系统时可能很有用。

    type BanType<T, E> = T extends E ? never : T// x可以时任何类型,但不能是T类型
    const isNoType = <T>(x: BanType<T, string>) => {console.log(x)
    }
    type NonNullable<T> = T extends null | undefined ? never : T;  // 使用示例  
    type T1 = NonNullable<string | null>;  // string  
    type T2 = NonNullable<number | undefined>;  // number  
    type T3 = NonNullable<never>;  // never

      通过正确地使用 never 类型,你可以编写出更加健壮和易于理解的 TypeScript 代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用System-Verilog实现FPGA基于DE2-115开发板驱动HC_SR04超声波测距模块|集成蜂鸣器,led和vga提示功能

文章目录 前言一、实验原理1.1 传感器概述&#xff1a;1.2 传感器引脚1.3 传感器工作原理1.4 整体测距原理及编写思路 二、System-Verilog文件2.1 时钟分频&#xff08;1&#xff09;clk_div.sv2.2 超声波测距&#xff08;1&#xff09;hc_sr_trig.sv&#xff08;2&#xff09;…

C# 语言类型(三)—数组/枚举类型/结构体

总目录 C# 语法总目录 参考链接&#xff1a; C#语法系列:C# 语言类型(一)—预定义类型值之数值类型 C#语法系列:C# 语言类型(二)—预定义类型之字符串及字符类型简述 C#语法系列:C# 语言类型(三)—数组/枚举类型/结构体 C#语法系列:C# 语言类型(四)—传递参数及其修饰符 C#语法…

比较两台计算机上的LabVIEW、工具包及驱动程序的一致性

比较两台计算机上的LabVIEW、工具包及驱动程序是否相同&#xff0c;可以通过以下步骤实现&#xff1a; 1. 检查LabVIEW版本 方法一&#xff1a;在LabVIEW中查看版本信息 步骤&#xff1a; 打开LabVIEW。点击菜单栏的 Help > About LabVIEW。记录显示的LabVIEW版本号和许可…

汽车数据应用构想(二)

一直说数据价值场景&#xff0c;啥叫有价值&#xff1f;啥样的场景有价值&#xff1f;按互联网的价值观来看&#xff0c;用户的高频需求就是价值。用户也许不会付费&#xff0c;但只要他天天用&#xff0c;那就是流量&#xff0c;就是用户黏性&#xff0c;就是价值&#xff01;…

力扣1 两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

阿贝云:免费虚拟主机和免费云服务器评测

阿贝云是一家知名的云服务提供商&#xff0c;提供免费虚拟主机和免费云服务器等服务。在今天的评测中&#xff0c;我们将对阿贝云的免费虚拟主机和免费云服务器进行详细的试用和评测。 首先&#xff0c;让我们来看看阿贝云的免费虚拟主机服务。阿贝云的免费虚拟主机提供稳定可靠…

方法重写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 基类的成员都会被派生类继承&#xff0c;当基类中的某个方法不完全适用于派生类时&#xff0c;就需要在派生类中重写父类的这个方法&#xff0c;这和…

HALCON飞拍贴片机框架程序——硬件介绍

本专栏主要讲解三头贴片机框架程序&#xff0c;包括硬件介绍和软件代码。硬件主要为视觉部分&#xff0c;软件为视觉检测代码部分。贴片机的机械硬件不做介绍。 具体设备运行视频可以搜索博主抖Y&#xff1a;“伶俐科技”观看。 贴片机硬件如下图分为三个部分&#xff0c;第一…

Go 语言中的日期与时间

在文章中&#xff0c;我们将深入探讨 Go 语言中日期和时间的处理。Go 提供了丰富的内置支持&#xff0c;通过 time 包&#xff0c;可以方便地进行时间的表示、格式化、计算以及比较。 文章目录 1、Go 语言中的日期时间介包介绍2、Go 语言中的日期时间介包的使用2.1、导入时间包…

网络安全等级保护,三级等保技术建议书(word原件获取)

1信息系统详细设计方案 1.1安全建设需求分析 1.1.1网络结构安全 1.1.2边界安全风险与需求分析 1.1.3运维风险需求分析 1.1.4关键服务器管理风险分析 1.1.5关键服务器用户操作管理风险分析 1.1.6数据库敏感数据运维风险分析 1.1.7“人机”运维操作行为风险综合分析 1.2…

Java数据结构与算法(有向图)

前言 有向图&#xff08;Directed Graph&#xff09;是一种由顶点和有方向的边组成的图数据结构。 实现原理 使用邻接表表示法实现有向图相对简单明了&#xff0c;步骤也相对简单。 1:首先创建有向图 2.创建顶点 3.顶点间创建边 具体代码实现 package test13;import ja…

Android bw_costly_<iface>链

测试时关注到bw_costly_链 因为和iface有关。猜测这个链是动态生成的。 开关数据业务测试&#xff0c;果然关闭数据业务后&#xff0c;bw_OUTPUT中不再会调用bw_costly_rmnet_data3&#xff0c;也没有bw_costly_rmnet_data3这个链了。 再次打开数据业务后出现了bw_costly_rmnet…

llvm 3.5 源码分析 clang for x86 002 之鸟瞰编译流程

0. 目标 debug的方式挖掘 clang 编译c文件的概述过程 1&#xff0c;示例源文件 summm.c int addd(int a, int b) {return ab; } 2&#xff0c;编译过程 $ clang -fPIE summm.c -c -o summm.o DEBUG: gdb clang set args -fPIE summm.c -c -o summm.…

【C语言】字符串逆序

(来源&#xff1a;牛客网) 题目&#xff1a; 将一个字符串str的内容颠倒过来&#xff0c;并输出。 数据范围&#xff1a;1≤len(str)≤10000 输入描述: 输入一个字符串&#xff0c;可以有空格 输出描述: 输出逆序的字符串 示例1 输入 I am a student 输出 tneduts…

Python 数仓建模

在Python中进行数据仓库&#xff08;Data Warehouse, 通常简称为数仓&#xff09;建模通常涉及到多个步骤&#xff0c;包括数据抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;、加载&#xff08;Load&#xff0c;即ETL过程&#xff09;&#xff…

详解 Spark核心编程之广播变量

广播变量是分布式共享只读变量 一、广播变量功能 ​ 广播变量用来将一个较大的数据对象发送到 Executor 并保存在内存中&#xff0c;同一个 Executor 中的所有 Task 都可以读取且只能读取广播变量中的数据&#xff0c;从而达到共享的目的&#xff0c;避免 Executor 中存在大量…

大语言模型技术系列讲解:大模型应用了哪些技术

为了弄懂大语言模型原理和技术细节&#xff0c;笔者计划展开系列学习&#xff0c;并将所学内容从简单到复杂的过程给大家做分享&#xff0c;希望能够体系化的认识大模型技术的内涵。本篇文章作为第一讲&#xff0c;先列出大模型使用到了哪些技术&#xff0c;目的在于对大模型使…

基于51单片机数控直流数控电源的设计

电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。当今电源技术融合了电气、电子、系统集成、控制理论、材料等诸多学科领域。直流稳压电源是电子技术常用的仪器设备之一,广泛的应用于教学、科研等领域,是电子实验员、电子设计人员及电路开发部门进行…

“华为杯”第十三届中国研究生 数学建模竞赛-E题:粮食最低收购价政策问题研究(续)

目录 4.3 问题三:粮食价格的特殊规律性模型 4.3.1 分析和建模 4.3.2 求解和结果

kotlin1.8.10问题导致gson报错TypeToken type argument must not contain a type variable

书接上回&#xff0c;https://blog.csdn.net/jzlhll123/article/details/139302991。 之前我发现gson报错后&#xff1a; gson在2.11.0给我的kotlin项目代码报错了。 IllegalArgumentException: TypeToken type argument must not contain a type variable 上次解释原因是因为&…