联合类型和额外属性

2023-12-19

当使用可以同时是联合类型情况的参数调用函数时,有没有办法让 TypeScript 编译器产生错误?例子:

interface Name {
  name: string
}

interface Email {
  email: string
}

type NameOrEmail = Name | Email

function print(p: NameOrEmail) {
  console.log(p)
}

print({name: 'alice'}) // Works
print({email: 'alice'}) // Works
print({email: 'alice', name: 'alice'}) // Works, but I'd like it to fail
print({email: 'alice', age: 33}) // Doesn't work

您可以使用方法重载:

interface Name {
  name: string
}

interface Email {
  email: string
}

function print(p: Name): void;
function print(p: Email): void;
function print(p: Name | Email) {
  console.log(p);
}

print({name: 'alice'}) // Works
print({email: 'alice'}) // Works
print({email: 'alice', name: 'alice'}) // Doesn't work
print({email: 'alice', age: 33}) // Doesn't work

这基本上将使方法实现的签名对代码的其余部分“不可见”。

Demo https://www.typescriptlang.org/play/#src=interface%20Name%20%7B%0D%0A%20%20name%3A%20string%0D%0A%7D%0D%0A%0D%0Ainterface%20Email%20%7B%0D%0A%20%20email%3A%20string%0D%0A%7D%0D%0A%0D%0Afunction%20print(p%3A%20Name)%3A%20void%3B%0D%0Afunction%20print(p%3A%20Email)%3A%20void%3B%0D%0Afunction%20print(p%3A%20Name%20%7C%20Email)%3A%20void%20%7B%0D%0A%20%20console.log(p)%3B%0D%0A%7D%0D%0A%0D%0Aprint(%7Bname%3A%20'alice'%7D)%20%2F%2F%20Works%0D%0Aprint(%7Bemail%3A%20'alice'%7D)%20%2F%2F%20Works%0D%0Aprint(%7Bemail%3A%20'alice'%2C%20name%3A%20'alice'%7D)%20%2F%2F%20Works%2C%20but%20I'd%20like%20it%20to%20fail%0D%0Aprint(%7Bemail%3A%20'alice'%2C%20age%3A%2033%7D)%20%2F%2F%20Doesn't%20work

Edit:

正如 @str 在严格模式下所指出的,重载签名需要指定返回类型。只要实现与可见签名中指定的返回类型兼容,仍然可以推断其返回类型。

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

联合类型和额外属性 的相关文章

随机推荐

  • WPF DataGrid 好的教程吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人可以向我指出互联网上优秀的 WPF DataGrid 教程吗 这些都是很好的 第二个是旧的 但仍然足够好 www wpftutoria
  • 退出命令行程序的首选方式是什么?

    这应该很简单 我只需要简单地退出我的命令行 C 程序 没有什么花哨的东西 我应该使用 Environment Exit or this Close 或者是其他东西 刚刚从Main method Edit 如果您确实失去了流程并希望从应用程序
  • 从 Elasticsearch 返回父数据和子文档

    是否可以通过在 Elasticsearch 查询中搜索子文档来返回父数据 我有两种文档类型 例如书籍和章节 作为父 子相关 非嵌套 我想对子文档运行搜索并返回子文档以及父文档中的一些字段 我试图避免对父级执行单独的查询 Update 我能找
  • 无法通过JAVA连接到HIVE2

    Referring to Hive2 https cwiki apache org confluence display Hive HiveServer2 Clients HiveServer2Clients JDBC created a
  • iPhone / iOS Facebook SDK - 您可以在应用程序内登录并保留登录凭据吗?

    是否可以使用 Facebook iOS SDK 在应用程序内进行身份验证 而不是转到 Safari 并保留这些身份验证凭据以供下次启动应用程序时使用 当我尝试在模拟器中使用演示应用程序时 它总是转到 safari 进行身份验证 这看起来有点
  • WPF UIElement.IsHitTestVisible=false;还在回击吗?

    我从 FrameworkElement 派生一个控件以用作 VisualCollection 的容器 因为我正在使用 DrawingVisuals 进行大量自定义渲染 创建游戏地图 我的容器有几个不同的实例 彼此层叠 我只想命中测试影响当前
  • 在什么条件下单位是一种类型?

    在此被标记为重复之前 我知道这个问题与使用单位作为类型参数时有关编译错误的各种问题有关 一些例子 Why is unit用作通用接口参数时 F 类型系统会以不同方式对待吗 https stackoverflow com q 26296401
  • 自动解码 TRESTResponse 中的 GZIP?

    似乎不可能为 TRESTClient 分配压缩器或拦截 如果我将 TRESTRequest AcceptEncoding 设置为 gzip deflate 我会收到来自支持 gzip 的服务器的 gzip 编码响应 然而 在 TIdHTTP
  • 是否有办法将 javascript 代码注入到 iframe 中执行,而无需删除并重新附加包含它的脚本标记?

    Context 我正在构建一个实时 HTML CSS 和 Javascript 编辑器 可以访问到here http experiments muditameta com qckmeddler 源码可以访问here https github
  • erlang nif 共享库上未定义的符号

    我在尝试将我的共享库 erlang nif 链接到另一个共享库 libpurple 时遇到麻烦 该共享库使用 dlopen 加载其他共享库 插件 问题是mylib so链接到libpurple so libpurple so使用dlopen
  • 使用 Jquery 删除逗号

    我需要一些从字符串中删除逗号的代码 我目前在 PHP 的 number format 中有各种数字 我使用 Jquery 将某些内容发布到更新页面 并且我需要从类中删除逗号 例如 这是一些代码 span class money 1 234
  • 如何默认显示连接线?

    你好 我刚刚开始使用这个 jquery 树 并想知道是否有任何属性可以设置以使连接线始终可见 选项中没有可用的属性将连接线设置为始终可见 但您可以使用以下命令向对象添加一个类fancytree container打开连接器的类 如果您希望连
  • 在 jQuery 中一起使用 :visible 和 :first-child

    我试图在 jQuery 中同时使用 visible 和 first child 伪选择器 但似乎没有成功 我有以下 HTML div a class action style display none Item One a a class
  • 如何在 Hadoop 中访问和操作 pdf 文件的数据?

    我想使用hadoop读取PDF文件 这怎么可能 我只知道hadoop只能处理txt文件 那么有没有办法将PDF文件解析为txt 给我一些建议 一个简单的方法是创建一个序列文件 http hadoop apache org common do
  • Android 媒体播放器停止后无法播放

    我有 5 首歌曲的音乐播放列表 我只希望只要我在应用程序中 播放和停止按钮就可以工作 当我想要的时候我可以停止音乐并开始另一个 现在这是如何工作的 音乐在 播放 按钮上播放 当我单击 停止 按钮时 它停止 但后来我想播放其他歌曲 或再次播放
  • 由于构建后步骤,未加载本机 dll 的符号 (pdb)

    我有一个用符号构建的本机发行版 dll 有一个构建后步骤会修改 dll 构建后步骤会进行一些压缩 并可能附加一些数据 pdb 文件仍然有效 但是 WinDbg 和 Visual Studio 2008 在构建后步骤之后都不会加载 dll 的
  • PHP 中的类发生了什么?

    如果我有这段代码 则会回显字符串 test 这是 PHP 5 3 中的内容 这是一些不应该依赖的疏忽 还是在 PHP 中实现多重继承的某种方式 class Test1 function getName return this gt name
  • 反应改变点击时列表项的类别

    我有一个像这样的反应元素 import React PropTypes Component from react class AlbumList extends Component constructor props super props
  • 为什么delete可以对const指针执行,而free却不能?

    我刚刚注意到指针传递给delete can be const合格而通过的人free不能 这对我来说确实是一个惊喜 在 C 中重载为operator delete应该有一个像这样的签名 void operator delete void p
  • 联合类型和额外属性

    当使用可以同时是联合类型情况的参数调用函数时 有没有办法让 TypeScript 编译器产生错误 例子 interface Name name string interface Email email string type NameOrE