如何防止元组的并集变成并集的元组?

2023-12-11

尝试编写一个在发生意外“失败”时优雅返回的函数。正在考虑使用 go 风格的函数 return 来 gonig,并将 return 键入为[Val, null] | [null, Error].

但是,当尝试使用 if 语句对返回值进行类型保护时,

const [val, err] = myFunc(); // => [Val, null] | [null, Error]

if (err) {
  handle(err);
  return;
}

// At this point in code, return value has to be of type [Val, null]

doSomethingWith(val) // Error! Type 'null' is not assignable to type 'Val'

考虑到类似的对象方法效果很好,这似乎令人困惑,(链接到游乐场)

const res = myFunc(); // => {type: 'Error'} | {type: 'Success', data: Val}


if (res.type === 'Error') {
  handle(res);
  return;
}

// In this example, res is correctly narrowed to {type: 'Success', data: Val}

doSomethingWith(res.data)

似乎元组的并集变成了并集的元组,

from [Val, null] | [null, Error]

to [Val | null, null | Error]

这是预期的行为吗?这是什么原因,有什么办法可以解决吗?


它没有变成联合元组 - 它变成了具有联合类型的两个变量,因为您将结果拆分为两个变量。 Typescript 不会跟踪不同变量类型之间的依赖关系,因此您对变量进行类型保护err不会也不可能缩小变量的类型val.

解决方案:将函数的结果分配给单个变量而不进行解构,然后使用result[0] and result[1]来引用它的组件。

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

如何防止元组的并集变成并集的元组? 的相关文章

随机推荐

  • 如何在工作流程中仅运行失败的会话

    在工作流程中 存在并行和顺序连接的会话 假设一些并行和顺序模式的会话失败 如何仅使用失败的会话重新启动工作流程 我如何在 Informatica 中进行设计 为工作流程打开 出错时暂停 为工作流程中的每个会话启用 恢复时重新启动 现在 如果
  • Python Scrapy 301 重定向

    在抓取给定网站时 我在打印重定向网址 301 重定向后的新网址 时遇到了一些问题 我的想法是只打印它们而不刮掉它们 我当前的代码是 import scrapy import os from scrapy spiders import Cra
  • 在 Python 中获取文件的原始二进制表示

    我想使用 Python 3 将文件中的确切位序列转换为字符串 关于这个主题有几个问题很接近 但没有完全回答 到目前为止 我有这个 gt gt gt data open file bin rb read gt gt gt data xa1 x
  • 使用 Enthought Canopy Python 在 Windows 上安装 OpenCV 的最佳方式?

    我已经在 Windows 上安装了 Enthought Canopy Python 发行版 并且我会 喜欢添加 OpenCV python 绑定 我已经从以下网站下载了最新的 OpenCVhttp sourceforge net proje
  • 使用 getServletConfig().getServletContext().getAttribute() (Java) 时获取 NPE

    我使用 Servlet 的时间并不长 我遇到了这个问题 我无法终止自己 我正在使用 Servlet 创建一个小型 Web 项目 并尝试将我的 Service 和 DAO 对象添加到 ServletContext HTTP Status 50
  • Python 中集合的不区分大小写比较

    我有两套 虽然我可以做列表 或者其他什么 a frozenset Today I am fine b frozenset hello how are you today 我想得到 frozenset Today 或者至少 frozenset
  • 打开 CSV 文件并将每一行写入新的动态命名的 CSV 文件

    我有一个 csv 文件 其中包含 50 行数据 我想将其拆分为每行的单独 csv 文件 其中包括第一行 标题 和相关行 例如 文件 1 包含 行 1 行 2 文件 2 包含 row1 row3 文件 3 包含 row1 row4 等等 目前
  • 如何在选择查询sql时添加空白行

    例子 当我输入 select number city from user get 中的结果是 3 行 如何select我可以自动填充8行的行吗 如果使用循环怎么办 期望的输出 如果有 3 行 则有 5 行空行 如果有 4 行 则有 4 个空
  • 在训练和测试数据中保留相同的虚拟变量

    我正在用 python 构建一个预测模型 其中包含两个独立的训练集和测试集 训练数据包含数字类型分类变量 例如邮政编码 91521 23151 12355 以及字符串分类变量 例如城市 芝加哥 纽约 洛杉矶 为了训练数据 我首先使用 pd
  • 用 python 加密 PDF

    有没有可能在Python中加密PDF文件 一种可能是压缩 PDF 但还有另一种方法吗 感谢您的帮助 问候 菲利克斯 您可以使用pypdf from pypdf import PdfReader PdfWriter reader PdfRea
  • Jquery 验证电子邮件地址或域名

    用户可以输入电子邮件地址或域名 我如何使用 jQuery 验证插件来验证这一点 可接受的值 电子邮件地址 域名 Eg email protected or sample com 我需要在同一文本框中验证域名 document ready f
  • 从 Go gRPC 处理程序中的客户端证书获取主题 DN

    我正在使用带有相互 tls 的 Golang gRPC 是否可以从 rpc 方法获取客户端的证书主题 DN func main creds credentials NewTLS tls Config ClientAuth tls Requi
  • 如何为滑块赋予不同的背景颜色?

    我想根据滑块位置为滑块提供两种不同颜色的颜色 一种颜色应位于滑块之前 另一种颜色应位于滑块之后 我使用 CSS 实现了其他设计 这是对输入 type range 进行皮肤处理的代码 input type range border 1px s
  • Request.UrlReferrer 为空?

    在 aspx C NET 页面 我正在运行框架 v3 5 中 我需要知道用户来自哪里 因为他们无法在不登录的情况下查看页面 如果我有页面A 用户想要查看的页面 重定向到页面B 登录页面 Request UrlReferrer 对象为 nul
  • Numpy 字典顺序

    我想按字典顺序对以下数组进行排序a 获取索引位置 但是 我在理解 numpy 结果时遇到问题 gt gt gt a np asarray 1 1 1 2 1 2 2 1 2 3 1 0 1 2 3 3 2 2 gt gt gt a arra
  • 强制浏览器下载 PDF 文档而不是打开它

    我想让浏览器从服务器下载 PDF 文档 而不是在浏览器本身中打开该文件 我正在使用 C 下面是我使用的示例代码 它不起作用 string filename Sample server url response redirect filena
  • 如何使用 C++11 std::thread 设置堆栈大小

    我一直在努力熟悉std 线程C 11 中的库 并且遇到了绊脚石 最初 我来自 posix 线程背景 并且想知道如何在构造之前设置 std thread 的堆栈大小 因为我似乎找不到执行此类任务的任何参考 使用 pthreads 设置堆栈大小
  • 将 SQL Server 2008 地理类型与 nHibernate 的 CreateSQLQuery 结合使用

    我正在尝试使用 nHibernate 2 0 1GA 发出 SQL 更新语句 如下所示 sqlstring string Format set nocount on update myusers set geo geography Poin
  • 更改日期变量的时区

    我有一个字符串 我已将其转换为日期变量 但事实证明时区是错误的 我尝试使用的字符串是 var v 2013 09 05 17 53 05 00 var parsedvalueInField new Date v 如果我发出 parsedva
  • 如何防止元组的并集变成并集的元组?

    尝试编写一个在发生意外 失败 时优雅返回的函数 正在考虑使用 go 风格的函数 return 来 gonig 并将 return 键入为 Val null null Error 但是 当尝试使用 if 语句对返回值进行类型保护时 const