TypeScript:具有可选值的可区分联合

2023-11-22

给定以下类型:

interface FullName {
  fullName?: string
}

interface Name {
  firstName: string
  lastName: string
}

type Person = FullName | Name;

const p1: Person = {};
const p2: Person = { fullName: 'test' };
const p3: Person = { firstName: 'test' }; // Does not throw
const p4: Person = { badProp: true }; // Does throw, as badProp is not on FullName | Name;

我希望p3导致编译器错误,如firstName存在而没有lastName,但事实并非如此——这是一个错误还是预期的?

此外,将 FullName.fullName 设置为必需会导致p3 (and p1) 导致错误。


首先,你的界面FullName只包含一个可选属性,基本上使其匹配任何内容。然后,当您使用它进行联合类型时,生成的类型将与所有内容兼容。

However,考虑声明和分配文字对象还有另一个问题,那就是您只能声明已知的属性:为什么我收到错误“对象文字只能指定已知属性”?

所以你可以毫无问题地执行此操作:

var test = { otherStuff: 23 };
const p4: Person = test;

但不是这个

const p4: Person = { otherStuff: 23 };

在你的情况下firstName是一个已知的属性FullName | Name,所以一切都好。

正如@artem 回答的那样,discriminated unions除了常规联合之外,在打字稿中具有特殊含义,需要特殊的结构假设。

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

TypeScript:具有可选值的可区分联合 的相关文章

随机推荐

  • Jmeter 的 WebSocket 插件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人可以与我分享 JMeter Websocket 协议插件采样器的链接吗 我尝试从下面的链接安装 https github com kawasim
  • 错误:管道损坏/MySQL 服务器已消失

    MySQL 抛出 Broken Pipe 和 MySQL Server has gone gone 错误 我的数据库表包含文本字段 我每隔 1 小时定期在其中插入大型 HTML 我应该考虑设置哪个 MySQL 变量 这是当前配置 mysql
  • C语言的unicode你好世界?

    我正在尝试从 C 输出 蠀 等内容 include
  • 启动和停止来自广播接收器的通知

    我正在尝试从广播接收器启动状态栏通知 然后从另一个广播接收器停止它 但我遇到了问题 我想在 USB 连接时在状态栏中启动通知 然后在 USB 断开连接时我想停止它 我设置了两个接收器并正在工作 只是在从接收器启动和停止一个接收器方面遇到困难
  • 如何从 DatePickerDialog 获取 DatePicker?

    我有一个活动弹出 android app DatePickerDialog DatePickerDialog dialog new DatePickerDialog this startDateSetListener start cal g
  • 固定页眉

    我以前从未处理过 CSS 但现在我必须处理 我正在开发一些 HTML 代码 一个网站的草图 并且有 CSS 问题 我希望我的标题位于固定位置 我的意思是它始终应该位于网站的顶部 即使有太多内容以至于网站必须滚动才能看到所有内容 我尝试过一些
  • 删除控制器/类中的 HttpServletRequest 参数的最佳方法?

    我有一个情况 我需要将 HTTP 请求对象重定向到其他控制器 类以进行进一步处理 问题是 在某些控制器中 我想更好地控制我转发到下一个类的参数 修改 编辑 删除它们 所以 我想知道是否有一个好的实践 模式来实现对 HTTP 请求参数的基本控
  • Android 4 ICS 上带有 SSL 客户端证书的 WebView

    我对 Android 上的本机 WebView 有问题 我需要使用 SSL 客户端证书对站点进行身份验证 Android WebView 似乎不支持这个 作为解决方法 我使用了 WebView 的修改版本 https github com
  • java中String转int数组

    我有一根绳子 String arr 1 2 ie 1 2 就像一个单一的字符串 我该如何转换这个arrjava中的int数组 String arr 1 2 String items arr replaceAll replaceAll rep
  • JavaScript 中的数字是不可变的吗? [复制]

    这个问题在这里已经有答案了 可能的重复 javascript 数字 不可变 我读了道格拉斯 克罗克福德 Douglas Crockford 的书 JavaScript the Good Parts 它说 JavaScript 中的数字是不可
  • 如何在不输入任何内容的情况下触发角度解析器

    正如主题所述 我如何触发在一个内部发生的动作 modelController parsers 没有用户输入 我能想到的唯一方法是将它们包装在函数中并调用它 但是有没有更好的方法来触发 pseudo modelController trigg
  • 对齐属性 已弃用

    不久前我发现中心标签已被弃用 这是可以理解的 因为 HTML 是用来构建内容的 而不是用来格式化的 但为什么对齐属性也被弃用了呢 属性可用于格式化 我明白CSS可以用 但并不是每个人都懂CSS 更糟糕的是 文本对齐 居中 and 左边距 自
  • 源代码不可用时的访问者模式实现

    考虑的原因之一访客模式 这种分离的实际结果是能够向现有对象结构添加新操作 而无需修改这些结构 假设您没有第三方库的源代码 并且您已经添加了对相关对象的一项操作 由于您没有对象 因此无法修改您的元素 第三方类 来添加访问者 在这种情况下 双重
  • 使用后备语言检索 i18n 数据

    我必须从数据库中获取 i18n 文本 默认语言为英语 其文本为一切 但非英语语言不一定具有所有所需的翻译 如果某个实体 键的非英语翻译在数据库中不可用 那么我希望它返回英语文本 所以 英语是fallback这里的语言 i18n 文本表如下所
  • 如何使用 CMake 有选择地链接到静态或动态 boost 库?

    我有一个 CMake 项目 有时想针对静态 boost 库进行编译 但我也希望能够轻松地使用 cmake GUI 中的动态库 在我的顶级 CMakeLists txt 中 我有以下内容 option USE STATIC BOOST Bui
  • jQuery 中的节流事件调用

    我有一个keyup事件绑定到需要大约四分之一秒才能完成的函数 search keyup function code that takes a little bit to complete 当用户键入整个单词或以其他方式快速按键时 该函数将连
  • 使用pyspark,在hadoop文件系统上读/写2D图像

    我希望能够在 hdfs 文件系统上读取 写入图像并利用 hdfs 局部性 我有一个图像集合 其中每个图像由以下内容组成 uint16 的二维数组 存储为 xml 文件的基本附加信息 我想通过 hdfs 文件系统创建一个存档 并使用 Spar
  • jQuery Mobile 破坏了我的网站

    当我仅使用移动触摸屏设备时 我会在网站上加载 jQuery Mobile 当我这么做的时候 它把一切都搞乱了 例如 选择菜单也不能正常工作 页面底部会出现 正在加载 正在加载 未定义 字样 我知道我错过了一些东西 但不知道是什么 关于我可能
  • JavaScript 对象的生命周期和内存泄漏

    我对此进行了相当多的研究 但主要是通过将其他问题拼凑在一起 这仍然留下了一些疑问 在一个不随时刷新浏览器页面并且可能会运行相当长一段时间 几个小时 而不关闭的应用程序中 假设刷新页面或导航到另一个页面会重新启动 js 代码 确保对象的最佳方
  • TypeScript:具有可选值的可区分联合

    给定以下类型 interface FullName fullName string interface Name firstName string lastName string type Person FullName Name cons