typescript基础之never

2023-11-11

TypeScript 的 never 类型是一种特殊的类型,它表示的是那些永远不存在的值的类型。例如,一个抛出异常或无限循环的函数的返回值类型就是 never,因为它们永远不会返回任何值。never 类型是所有类型的子类型,也就是说,任何类型都可以赋值给 never 类型,但是 never 类型只能赋值给自己和 any 类型。never 类型有以下的特点和用途https://juejin.cn/post/7201048368389914682:

•  never 类型不能被实例化,也不能有任何值,甚至 undefined 也不行。

•  never 类型可以用来表示不可能发生的情况,例如在 switch 语句中的 default 分支,或者在类型保护中排除掉所有可能的情况。

•  never 类型可以用来进行疲劳性检查(exhaustiveness check),也就是检查是否所有的分支都被覆盖到了,如果有遗漏,就会报错。

下面是一些使用 never 类型的例子:

// 抛出异常的函数的返回值类型是 never
function throwError(message: string): never {
    throw new Error(message);
}

// 无限循环的函数的返回值类型也是 never
function loopForever(): never {
    while (true) {}
}

// 使用 never 类型来表示不可能发生的情况
type Direction = "up" | "down" | "left" | "right";

function move(direction: Direction) {
    switch (direction) {
    case "up":
        // do something
        break;
    case "down":
        // do something
        break;
    case "left":
        // do something
        break;
    case "right":
        // do something
        break;
    default:
        // 如果有遗漏的情况,就会报错
        const invalid: never = direction;
        // Error: Type 'string' is not assignable to type 'never'
    }
}

// 使用 never 类型来进行疲劳性检查
class ExhaustiveError extends Error {
    constructor(value: never, message?: string) {
        super(message);
    }
}

function checkExhaustive(value: Direction) {
    switch (value) {
    case "up":
        // do something
        break;
    case "down":
        // do something
        break;
    default:
        // 如果有遗漏的情况,就会抛出异常
        throw new ExhaustiveError(value);
        // Error: Argument of type 'string' is not assignable to parameter of type 'never'
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

typescript基础之never 的相关文章

  • 我可以通过什么方式混合 jQuery 和 vanilla JavaScript

    我有一个用普通 JavaScript 编写的 Web 应用程序 我想用 jQuery 动画来增强它 并使用我在各种 jQuery 插件中找到的一些功能 例如上传 http www uploadify com 可以通过什么方式将 jQuery
  • 在有限的上下文中运行 JS 代码

    我正在尝试奔跑trusted 隔离 上下文中的 JS 代码 基本上想出了这个方法 function limitedEval src context return function with this return eval src call
  • 在上传之前预览图像 VUEjs [重复]

    这个问题在这里已经有答案了 我知道这个问题已经被问过 但我不知道如何在vuejs中使用代码 我尝试了很多但没有任何结果 我还添加了我的代码 有人可以帮帮我吗 这是我的代码 谢谢 html
  • 以下文档我无法创建 Vue.js 3 的实例

    The code https stackblitz com edit vue ttt file src main js https stackblitz com edit vue ttt file src main js 问题 我正在尝试在
  • 更新存储在 chrome 扩展本地存储中的对象

    我正在开发一个 chrome 扩展 我将存储服务器发送的对象 例如 我将收到 命令 id 1 类型 A 大小 B 优先级 C 如果我有一个数据库 我会将其作为表中的一行插入commands 使用 chrome storage 我将这些对象的
  • onClick 处理程序在每个渲染周期触发

    我有这样的默认状态 this state selectedTab tab1 then 我的渲染方法是这样的 render const selectedTab this state return li tab1 li li tab2 li d
  • 正则表达式中连字符的这种用法有效吗?

    NB I only想知道它是否是正则表达式定义中未转义连字符的有效应用 它是not关于匹配电子邮件 连字符或反斜杠的含义 量词或其他任何内容的问题 另外 请注意 链接的答案并没有真正讨论转义 未转义连字符之间的有效性问题 通常我会像这样声明
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • jQuery:将文本区域滚动到给定位置

    我有一个包含很多文本的文本区域
  • Angular 4 Http POST 不起作用

    我希望每个人都做得很好 我最近开始使用 Angular 4 4 我一直在尝试将数据发布到我的 api 服务器 但不幸的是它不起作用 我花了大约两天的时间 但仍然没有成功 甚至已经尝试过 6 7 篇文章角 io https angular i
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • 从链接打开本地文件夹

    如何通过单击任何链接打开本地文件夹视图 我尝试了很多选择 例如 a href Open folder a or a Open folder a or a Open folder a 解决方案 启动可下载链接 以下内容适用于所有浏览器 但一如
  • node.js 模块/导出系统:是否可以将模块导出为函数

    我想在 Dispatch js 中做这样的事情 function handle msg exports handle 这在调用index js中 var dispatch require Dispatch dispatch data 有任何
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 了解 Document.createElement()

    我在用着GWT及其底层DOM能力 我基本上想要实现的是 Have a div包含一些文本的元素 其中一些文本将被包围span元素 span 元素可相互拖动并提供上下文菜单 New span元素可以由最终用户动态创建 它可能是这样的 在应用程
  • 如何解决“消息端口在收到响应之前已关闭”的问题。在 JavaScript 中的 window.location.reload() 之后

    我遇到了 javascript 问题 从 chrome v73 0 3683 86 开始 每当我在 window location reload 函数之后运行 javascript 代码时 它总是给我错误 Unchecked runtime
  • Three.js点击单个粒子

    In this example http jsfiddle net agqq96bq 2 您可以看到 2 个可点击的粒子 但它们都受到点击的影响 另外 我只想检测粒子上的点击 而不将它们过滤出场景 像这儿 if intersects len
  • Vue - 调度完成后调用 store getter?

    我正在使用 Laravel 5 7 Vue2 Vuex 我在调度调用完成后让 Vue 返回存储值时遇到一些困难 我的申请流程如下 我单击一个提交按钮 该按钮调用组件上的 validate Validate 分派到我的 addLease 操作
  • Angular 4 中的箭头函数(Lambda 函数)

    我对lambda知之甚少 lambda表达式被视为一个函数 我们有很多方法可以做到这一点 这是我的简单功能TypeScript file byPan card1 card2 return card1 pan card2 pan 我在 HTM
  • 如果 POST 响应仅包含 ID,如何将数据保存到我的 Ember 存储?

    Ember 数据期望我的服务器在每次成功后返回完整的对象POST 但是 我的 API 只返回一种元对象 其中包含id 当 Ember 收到此对象时 记录中的现有数据将被删除 除了id 例如 当我这样做时 var asset App Asse

随机推荐

  • Javascript数组排序sort方法和自定义排序方法

    前言 针对一个数组进行排序 一个很常见的需求 尤其在后端 当然 前端也是有这个需求的 当然 数组排序 是有现成的方法的 就是sort 方法 我们先开看下这个 标准答案 sort方法 var arr 45 98 67 57 85 6 58 8
  • babel6.X、babel7.x、 babel8.x用法

    babel6 x使用方法 需要安装的包 npm install babel loader save npm install babel core save npm install babel preset es2015 save npm i
  • Jmeter2-手机验证码方式进行用户登录

    使用手机验证码实现登录 调用了两个接口 一是发送短信验证码 二是用户登录 思路 1 使用CSV Data Set Config参数化 2 获取时间戳 3 发送短信验证码 4 使用BeanShell取样器从redis缓存中获取短信验证码 5
  • Grafana与python后端通过get请求进行通信

    插件配置请参考 Grafana获取URL地址中的json数据 Grafana下载如下插件 文章目录 模拟URL路由 配置Grafana插件 效果展示 模拟URL路由 from fastapi import FastAPI Query imp
  • postman请求一个url,could not get any response

    postman请求一个url不通 浏览器可以访问通 preface 现象 排除问题 总结 preface 最近 同事使用 postman 遇到一个问题 url 请求不通 could not get any response 现象 排除问题
  • 使用 Iceberg on Kubernetes 打造新一代云原生数据湖

    背景 大数据发展至今 按照 Google 2003年发布的 The Google File System 第一篇论文算起 已走过17个年头 可惜的是 Google 当时并没有开源其技术 仅仅 是发表了三篇技术论文 所以回头看 只能算是揭开了
  • STM32速成笔记—ADC

    文章目录 一 什么是ADC 二 ADC的用途 三 STM32F103ZET6的ADC 3 1 ADC通道对应引脚 3 2ADC时钟 3 3 ADC工作模式 3 4 ADC转换时间 3 5 ADC校准 3 6 ADC转换结果与实际电压的换算
  • js中的对象和函数的彻底理解

    在js中对象就是神一般的存在 什么都是对象 包括函数 你就这么理解好了 函数是用来实现具体功能的代码 用一种方式把他们组织起来 就是函数了 对象是有属性和方法的一个东西 在对象中的函数就变成了方法 刚学习js不用太纠结这些概念性的东西吧 慢
  • Python学习第十六天——数据库基础与MySQL基础操作

    数据库分类 1 关系型数据库 有固定的表结构 并且表与表之间可以建立关系 常见数据库 MySQL PostgreSQL Oracle db2 sqlite sqlserver access mariadb 2 非关系型数据库 没有固定的表结
  • EMWIN密码验证窗口创建

    EMWIN密码验证窗口创建 调用接口 file PasswdCheck c date 2020 7 6 author aron566 copyright None brief 通用密码验证页面 details None version V1
  • 买不到的数目 遍历法和公式推导法(第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAC组)

    突然决定要参加蓝桥 已经超级久没复习C C 的我考前还是决定打几道题捡一捡C C 的语法和思路 2023年蓝桥的题之后会出 因为 AcWing上还没有出可以测试的程序 也没把握说自己考场上做的就是对的 目录 题目 思路 代码 题目 小明开了
  • 华为od机试题5 真题

    华为od机试题 真题 45 满足规则的数组组合 44 最长连续子序列的和等于输入值 43 整数编码 42 输出指定格式字符 40 小朋友分班 39 数列解析 38 url拼接 36 满足最低能力值的数量 以下题目附带Java解法 是我个人写
  • shell中的求幂

    小白今天突然想用shell来求一下2的32次幂 一时竟想不出求解办法 上网搜了一下 操作之后 发现很简单 如下 oracle linux101 gt echo 2 32 bc l 由此可得 bc并不支持幂的求法 standard in 1
  • JVM概述

    1 什么是JVM JVM是Java Virtual Machine Java虚拟机 的缩写 JVM是一种用于计算设备的规范 它是一个虚构出来的计算机 是通过在实际的计算机上仿真模拟各种计算机功能来实现的 引入Java语言虚拟机后 Java语
  • Vue项目打包后,修改请求后端的地址

    目录结构 其中public文件夹中的东西会原封不动的打包 因此在里面新建一个webConfig json baseURL http 6060 socketURL timeout 10000 在main js中设置 import axios
  • git 小乌龟 配置_小乌龟(TortoiseGit)基本使用详解

    1 环境安装 Git最新版下载地址 https gitforwindows org TortoiseGit Git客户端 32 64位最新版及对应的语言包下载地址 https tortoisegit org download 安装的方法 一
  • GitHub copilot用不了,有什么好的替代?

    如果你无法使用GitHub Copilot 以下是一些替代方案 Visual Studio IntelliSense 如果你使用Visual Studio Code作为开发环境 可以安装IntelliSense插件 它提供了类似的智能代码补
  • ChatGPT在GIS领域应用初测

    1 引言 ChatGPT是由OpenAI开发的一种大型语言模型 它使用了Transformer架构 在大量现实世界文本数据上训练 以捕捉人类语言的复杂性和多样性 能够实现许多人工智能语言处理任务 如回答问题 进行翻译 修改代码 生成文档 文
  • Cisco UC 项目常见问题及解决方法

    第一大类 Callmanager 1 OS product key BTOO VQES CCJU IEBI 2 增加subscriber 服务器 1 在publisher上增加一个server 2 在subscriber上手动启动需要的服务
  • typescript基础之never

    TypeScript 的 never 类型是一种特殊的类型 它表示的是那些永远不存在的值的类型 例如 一个抛出异常或无限循环的函数的返回值类型就是 never 因为它们永远不会返回任何值 never 类型是所有类型的子类型 也就是说 任何类