基于判别器的 Typescript 窄参数类型

2024-01-26

我有一个旧版 API,如下所示(游乐场链接 https://www.typescriptlang.org/play?#code/C4TwDgpgBAwg9gWwQQwHYBMCMUC8UDeAUFCVAMYLoBcUARAiFAGYCWATgM7DmIoa0AaYqWRsA5phpc2LVGKGkoosQCYaAIzhwANhDSEAvoUKhIsXmnQrcBYSQrU6DKBwhk4GHkkuC7zLVLAMnIKpOqiNKgArgjqEGyGxqbQ8N6eeKl8WFAAPuZpVsZMUahkwCweUBAAHm5RwBAAFA40mZYA2rQOtAC6AkriHFRojAD0AFRQAO5wUdroUNosANbQwHAuQR5i2ozJUMAAFiwcUOOjAJS2iu6oHDoQAHTacGKNyhwXiYQ1dQ2N9EYrE43HcBUEBAmUC0YFOCBOHFkYigYDYcFhZ1GBi+QA)...

type Command1 = {
    cmd: "my first command",
    arg1: string,
    arg2: boolean
}

type Command2 = {
    cmd: "my second command",
    foo: string,
    bar: number
}

type Command = Command1 | Command2

function execute(cmd: Command["cmd"], args:any /* would like to strongly type this */) {
    console.log(args)
}

execute("my first command", {/* oops missing props */})

有什么方法可以输入检查args的参数execute函数不改变函数的参数列表?

Thanks


Use 提取 https://www.typescriptlang.org/docs/handbook/utility-types.html#extracttype-union (操场 https://www.typescriptlang.org/play?#code/C4TwDgpgBAwg9gWwQQwHYBMCMUC8UDeAUFCVAMYLoBcUARAiFAGYCWATgM7DmIoa0AaYqWRsA5phpc2LVGKGkoosQCYaAIzhwANhDSEAvoUKhIsXmnQrcBYSQrU6DKBwhk4GHkkuC7zLVLAMnIKpOqiNKgArgjqEGyGxqbQ8N6eeKl8WFAAPuZpVsZMUahkwCweUBAAHm5RwBAAPDBV1Q0YHPlZANq0DrQAugB8ABQONDACSuIcNADyCCzAjQCibWzIZc0WGFP45JQTUAZDU32UtEMAlLaK7qgcOhAAdNpwYmOUU8ocV4mENTqDRG9EYrE43HcBUEBGmEhotAA1hx0DDlGooEEotADH8AbUyPUICDnK57ugvFkYfsmAE6ABHADuEBh4TYNAALNZcYQgA):

function execute<Cmd extends Command["cmd"]>(
  cmd: Cmd, 
  args: Omit<Extract<Command, { cmd: Cmd }>, "cmd">
) {
    console.log(cmd, args)
}

// execute<"my first command">(cmd: "my first command",   args: Omit<Command1, "cmd">): void
execute("my first command", { arg1: "ksd", arg2: true })

// execute<"my second command">(cmd: "my second command", args: Omit<Command2, "cmd">): void
execute("my second command", { foo: "qwe", bar: 123 })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于判别器的 Typescript 窄参数类型 的相关文章

随机推荐

  • 如何使用加密模块使用公私钥对进行加密和解密?

    我必须使用加密模块在 Node js 中编写代码 因为除了 MIT 许可之外 我不允许使用任何模块 我需要生成一个密钥对并使用公钥加密一些消息并使用私钥解密 第一部分 即密钥对的生成已完成 我没有得到任何线索如何使用加密模式使用相同的密钥对
  • ‘1004’: “排序参考无效。”

    我正在尝试对单独的工作表中的范围进行排序 然而 我不断收到这样的消息 1004 The sort reference is not valid Make sure it s within the data you want to sort
  • Apple 推送通知中的表情符号支持

    我正在开发名为 INTERSTIZIO 的 iPhone 应用程序 在这个应用程序中 我实现了用户之间聊天等功能 在此用户可以发送文本 位置和带有表情符号的文本 如果应用程序在接收端未处于打开模式 则从后端发送生成推送并显示给接收者 我可以
  • if 和 for 循环包含在 while 循环 VBA 中

    我正在尝试编写一些代码 循环在一个列中抛出一列数据 并将其与同一工作表中另一列中的数据进行匹配 当两个数据点匹配时 相应的数据将被复制到第一个数据点旁边 最简单的表达方式是我在 while 循环内的 for Staten 内有一个 if 语
  • 用于通过电子邮件发送活动电子表格的 Google Apps 脚本

    我在网上找到了一个脚本 它可以获取当前工作表 将其复制到临时的新电子表格中 将其转换为 PDF 并通过电子邮件发送 我能够让它工作 但尝试将其设置为仅发送特定范围 尝试了一下 但无论如何我都不是一个好的编码员 或者 我也有兴趣弄清楚如何让它
  • CGIHTTPRequestHandler 在 python 中运行 php 或 python 脚本

    我正在 Windows 上编写一个简单的 python Web 服务器 它可以工作 但现在我想运行动态脚本 php 或 py 而不仅仅是 html 页面 这是我的代码 from BaseHTTPServer import HTTPServe
  • Oracle数据库连接超时设置

    如果一段时间不活动 与 Oracle 数据库的连接会被断开 这会导致错误 gt end of file on communication channel 客户端计算机上是否有任何 Oracle 设置 sqlnet ora 或某种环境变量 可
  • 绑定和连接之间有什么关系?

    我的印象是 gt gt 由 Haskell 使用 和join 数学家更喜欢 是 相等的 因为一个可以用另一个来写 import Control Monad join join x x gt gt id x gt gt f join fmap
  • 是否值得对数据库中的电子邮件地址进行加密?

    我已经在使用了加盐哈希 http www matasano com log 958 enough with the rainbow tables what you need to know about secure password sch
  • 用vb6实现多线程

    我的任务是通过连接到电脑的多个串行端口实现自动化过程 我如何使用 vb6 实现多线程 以通过附加的串行端口独立执行一些自动化任务 提前致谢 不 vb6 不支持多线程 它通过破解 winapi 在 vb5 中工作 但在 vb6 中完全被破坏
  • JSF不支持跨域验证,有解决方法吗?

    JSF 2 0 只允许您验证一个字段上的输入 例如检查它是否具有特定长度 它不允许您有一个表格 其中显示 输入城市和州 或仅输入邮政编码 你是怎么解决这个问题的 我只对涉及 JSF 验证阶段的答案感兴趣 我对将验证逻辑放入托管 Bean 不
  • 交叉验证 SPARK 期间的自定义评估器

    我的目标是向 CrossValidator 函数 PySpark 添加基于排名的评估器 cvExplicit CrossValidator estimator cvSet numFolds 8 estimatorParamMaps para
  • Angular 2子路由会刷新父路由吗

    我有一个应用程序 在某些情况下 我在父路线的子路线之间进行路线 一个看起来像example com a 1 其他example com a 2 将从切换1 to 2触发页面的重新加载 渲染a 就像播放视频一样a并且有一个与该视频同级的路线出
  • equals 和 hashCode 的通用反射辅助方法

    我正在考虑为 equals 和 hashCode 创建一个反射辅助方法 在 equals 的情况下 辅助方法会通过反射 API 查找 objectA 的字段 并将它们与 objectB 的字段进行比较 对于 hashCode 辅助方法会检查
  • Common Lisp 中的 comma-comma-at

    我对 comma comma at 的作用感到困惑 使用 comma comma at 的示例如下定义 Lisp 宏时是否需要使用双引号 双逗号 https stackoverflow com questions 17938242 is t
  • 注册DLL时出错

    我正在尝试使用命令 regsvr32 dll name dll 注册 DLL 但出现以下错误 模块 Addition dll 已加载 但 找不到入口点 DLLRegisterServer 确保 Addition dll 是有效的 DLL 或
  • AppleScript 和 Mail.app:检查新消息是否包含字符串

    我正在编写一个脚本来检查是否已提交特定的网络表单 到目前为止 脚本内容如下 tell application Mail check for new mail set newmail to get the unread count of in
  • 将 Json String 反序列化为多种 Object 类型

    我有一个从网络服务获得的 Json 字符串 它有一个集合列表 每个集合代表一个对象 例如 Root List First Collection Team Object id 1 team name Equipe Saidi is activ
  • 找不到驱动器 ID。您有权查看此文件吗? Android 谷歌驱动器集成

    我正在使用以下代码github https github com googledrive android demos blob master src com google android gms drive sample demo Edit
  • 基于判别器的 Typescript 窄参数类型

    我有一个旧版 API 如下所示 游乐场链接 https www typescriptlang org play code C4TwDgpgBAwg9gWwQQwHYBMCMUC8UDeAUFCVAMYLoBcUARAiFAGYCWATgM7