Typescript 类似数组的类型,每个项目的键之间具有相同的泛型类型

2024-04-09

我想编写一个接受这样的参数的打字稿函数:

myFunc([
  {
    initialValue: 6, // number
    finalValue: 8    // number
  },
  {
    initialValue: 'hello', // string
    finalValue: 'goodbye'  // string
  }
])

但如果给出以下内容将会失败:

myFunc([
  {
    initialValue: 6, // number
    finalValue: 'goodbye' // should fail because not a number!
  }
])

感觉解决方案应该需要泛型,但是泛型是泛型的在每个数组项中,在整个数组中不是通用的。

EDIT:我想要一个适用于任何类型的值的解决方案,而不仅仅是字符串或整数。我可能也需要将其用于类/函数。


您可以使用泛型和映射类型来实现类似的功能。我们将使用类型参数来捕获参数的实际类型(无论是什么,即使它确实包含无效的初始/最终对)。然后我们将此类型转换为新类型,其中finalValue是根据实际情况输入的initialValue传入。我们将这个新类型与参数类型中的交集一起使用。这意味着参数的类型被推断到类型参数中,但对照转换后的类型进行检查:

type FinalValues<T extends Array<{ initialValue: any }>> = {
    [P in keyof T]: T[P] extends { initialValue: infer I } ? { initialValue: I, finalValue: I }: never 
}

function myFunc<T extends [{ initialValue: any }] | Array<{ initialValue: any }>>(v: T & FinalValues<T>): FinalValues<T> {

}

myFunc([
  {
    initialValue: 6, // number
    finalValue: 8    // number
  },
  {
    initialValue: 'hello', // string
    finalValue: 'goodbye'  // string
  }
])

myFunc([
  {
    initialValue: 6, // number
    finalValue: "string"    // err
  },
  {
    initialValue: 'hello', // string
    finalValue: 1  // err
  }
])

您还可以更有创意一点,添加一种自定义错误,以便错误更具可读性:

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

Typescript 类似数组的类型,每个项目的键之间具有相同的泛型类型 的相关文章

随机推荐

  • Laravel 属于关系

    好吧 我对模型的 belongsTo 关系有点困惑 我有一个扩展 Elogent 的 Feeds 模型 我创建了一个名为 User 的关系函数 public function user return this gt belongsTo Us
  • 如何使用Matplotlib在图形中间绘制轴

    我想画一条平行于 y 轴且位于 x 轴中间的静态垂直线 当图中平移时 这条线不应移动 我的目标是让图形中间的这条垂直线作为参考线 我将有一些其他数字 它们表示取决于 x 轴中间的 x 值的数据 该线的端点坐标在轴坐标中为 0 5 0 和 0
  • Python API从密钥服务器获取PGP公钥?

    有没有可以从公钥服务器获取 PGP 公钥的 Python API 如果您正在查询 MIT PGP 密钥服务器 您可以使用 HTTP 我选择 urllib2 和 beautiful soup http pgp mit edu extracth
  • 即使应用程序在线,也要先查询Firestore离线数据[重复]

    这个问题在这里已经有答案了 即使应用程序在线 就像我们在 Firebase 实时数据库中所做的那样 如何首先检索 查询 Firestore 离线数据 谁能帮我解决 Android 版的这个问题吗 Thanks Satish 当您连接到服务器
  • Crystal Reports XI 中正确的 ISO 周编号

    如何在 Crystal Reports XI 中获取给定日期的 ISO 8601 周数 水晶报表支持DatePart 可以为您提供给定日期的 ISO 周数的函数 NumberVar week DatePart ww date crMonda
  • 将附加模板添加到右侧边栏 magento

    我只是尝试添加额外的模板文件以在右侧栏中包含内容块 但失败了 下面是我的努力 添加到 local xml 文件中
  • 如何将文本附加到android中的edittext中?

    在我的应用程序中 我想为用户提供从列表中选择文本并附加到编辑文本中的方法 但是我找不到任何有关如何执行此操作的文档 任何帮助都会有很大帮助 谢谢 只需使用 EditText 的append 即可 参数将附加在可编辑内容的末尾
  • 如何在 anaconda python 中导入 OpenGL?

    我在 anaconda python 上使用 ipython 笔记本 但我不知道如何安装或导入 opengl 谁能帮我解决这个问题吗 我在 Linux xubuntu 上使用 anaconda 抱歉英语不好 正如 David 所指出的 Vi
  • 用javascript求解线性方程组[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 使用 JavaScript 求解线性方程组的最佳方法是什么 我想找到向量 r 的解决方案 M r b 其中 M 是矩阵 b 是向量 我知道
  • SMS 的 .NET 代码

    HI all 我正在编写一些代码来通过 Zeep Mobile 发送 接收短信 http zeepmobile com developers http zeepmobile com developers 我查看了他们的谷歌群组 甚至联系了他
  • 如何更改另一个程序窗口的按钮文本

    我的任务是更改窗口中按钮的文本 我没有并且cannot访问源代码 因为它由我们付费订阅的公司拥有 如何在没有源代码的情况下更改按钮文本 我正在尝试使用 pInvoke 但遇到问题 窗口标题会根据您的合作对象而变化 订单输入表 姓氏 名字 因
  • JSON 反序列化抛出异常 - 无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例

    以下是我的 JSON 响应 导致 com fasterxml jackson databind JsonMappingException 无法从 START OBJECT 令牌反序列化 java util ArrayList 的实例 在 来
  • Java正则表达式 - 在空格上分割字符串 - 忽略引号中的空格和转义引号[重复]

    这个问题在这里已经有答案了 我正在寻找正则表达式来在Java中执行以下操作 String originalString String splitString originalString spilt regex 一些测试用例 Origina
  • 单击标签未打开选择

    我一直以为 点击label将或多或少地 触发 相应表单元素的点击 然而 这似乎不起作用select 选择字段上的鼠标按下 动画有效 但选择未打开 我试过这个
  • 使用 CSS,P 标签在 Firefox 中的显示位置低于在 Internet Explorer 中的显示位置

    我制作了一个在 Internet Explorer 上看起来很完美的网站 但是当用 Firefox 加载时 某些元素不对齐 例如 出现在坐标 20 20 上的 p 标签在 Firefox 中会出现在坐标 20 40 上 出于某种原因 Fir
  • 为什么要实现finalize()?

    我已经阅读了很多 Java 新手问题finalize 令人困惑的是 没有人真正明确表示 Finalize 是一种不可靠的清理资源的方法 我看到有人评论说他们用它来清理连接 这真的很可怕 因为接近保证连接关闭的唯一方法是最后实现 try ca
  • IntelliJ 调试:暂停整个虚拟机,然后进入单线程

    我正在调试一个具有大量线程的应用程序 我的断点设置为暂停整个虚拟机 当线程遇到其中一个断点时 我想使用 Step Over 但这似乎会恢复整个虚拟机 直到该步骤完成 如果我可以只单步执行到达断点的单个线程 那确实会有帮助 在 Intelli
  • 如何获取托管对象的引用计数?

    NET 分析器可以显示托管对象的引用计数 他们如何计算它们 他们使用非托管 API 来提供对探查器的访问 ICorProfiler回调 http msdn microsoft com en us library ms230818 aspx
  • 如何清除宏中的文本框?

    我有一个用于组合 onclick 事件的宏 当用户单击组合框并进行选择时 如何以相同的形式清除文本框 我想在同一个宏而不是过程中进行清除 不清楚宏是什么意思 您是指 Access 中的新宏语言 还是 VBA 代码 在 VBA 代码中 您可以
  • Typescript 类似数组的类型,每个项目的键之间具有相同的泛型类型

    我想编写一个接受这样的参数的打字稿函数 myFunc initialValue 6 number finalValue 8 number initialValue hello string finalValue goodbye string