Typescript:具有不同参数的泛型数组

2023-12-07

考虑一个这样调用的函数:

func([
   {object: object1, key: someKeyOfObject1},
   {object: object2, key: someKeyOfObject2}
])

它有一个数组。我想强制执行key字段保存所保存对象的键object. 每个物体都可以有不同的形状。

为单个对象构造这样的类型很容易:

type Type<T> = { obj: T, key: keyof T }

但是,我不知道如何从中创建一个数组,其中每个元素都会被强制执行。Type<any>[]会掉落所有类型。


在功能方面限制这一点是很困难的。我什至不认为有通用的方法可以做到这一点。

非泛型解决方案:函数重载

interface Item<TObject> {
  object: TObject
  key: keyof TObject
}

function func<T1, T2, T3, T4>(items: [Item<T1>, Item<T2>, Item<T3>, Item<T4>]): void
function func<T1, T2, T3>(items: [Item<T1>, Item<T2>, Item<T3>]): void
function func<T1, T2>(items: [Item<T1>, Item<T2>]): void
function func<T1>(items: Item<T1>[]): void {

}

func([
  { object: { a: '1' }, key: 'a' },
  { object: { b: '1' }, key: 'b' },
  { object: { c: '1' }, key: 'a' }, // not allowed
])

解决方案 2:在调用方强制执行类型基本上,您依赖效用函数。仍然有办法在这里犯错误并让编译器错过它(请参阅示例中的最后一项)

interface Item<TObject extends object> {
  object: TObject
  key: keyof TObject
}

function func(items: Item<any>[]) {

}

function createItem<T extends object>(object: T, key: keyof T): Item<T> {
  return {
    object,
    key
  }
}

func([
  createItem({ a: 1 }, 'a'),
  createItem({ b: 2 }, 'f'), // not allowed
  { object: { b: 2 }, key: 'f' }, // allowed
])

解决方案 3:使用通用 add 方法创建处理器对象

interface Item<TObject> {
  object: TObject
  key: keyof TObject
}

function createMyArrayProcessor() {
  const array: Item<any>[] = []

  return {
    add<T>(item: Item<T>) {
      array.push(item)

      return this
    },
    result() {
      // process the array here and return the result
    }
  }
}

const result = createMyArrayProcessor()
  .add({ object: { a: '1' }, key: 'a' })
  .add({ object: { b: '1' }, key: 'b' })
  .add({ object: { c: '1' }, key: 'a' }) // not allowed
  .result()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript:具有不同参数的泛型数组 的相关文章

随机推荐

  • Matplotlib 散点图 - 删除白色填充

    我正在使用 matplotlib 在纬度经度坐标中绘制变量 问题是该图像不能包含轴或边框 我已经能够删除轴 但图像周围的白色填充必须完全删除 请参阅下面代码中的示例图像 https i stack imgur com nHCPF jpg 我
  • 如何使用MySQL DECIMAL?

    我不太了解 MySQL 的 DECIMAL 我需要该行能够包含 00 0001 到 99 9999 之间的任何数字 我将如何构建它以像这样工作 双列是not与 DECIMAL 列相同 并且您会遇到麻烦如果您对财务数据使用双列 DOUBLE
  • 为什么 AnsiSameText 不是 ANSI?

    从名字上看 人们会相信 SysUtils Delphi XE 中定义的 AnsiSameText 将接收 ANSI 字符串作为参数 但该函数的定义如下 function AnsiSameText const S1 S2 string Boo
  • 上传前验证文件大小

    我需要验证要上传到服务器的文件 上传之前必须进行验证 即在客户端完成验证 此任务应在 ASP NET MVC3 网页中完成 它还应该适用于所有浏览器 IE9 8 7 FF Chrome 我发现 IE 没有 FileReader API 我的
  • 无法在 Solr 中使用 ICUTokenizerFactory

    我正在尝试在 Solr 模式中使用 ICUTokenizerFactory 这就是我的定义field and fieldType
  • jQuery 拖动/使用 CSS 变换比例调整大小

    我正在应用 CSS 转换 以及浏览器特定的 webkit o 等 变换 矩阵 0 5 0 0 0 5 0 0 到一个 div 然后在该 div 的子级上使用 jQuery 的draggable 和 ressized 插件 我遇到的问题是 当
  • OnActionExecuting 在标准 asp.NET 中等效吗?

    是否有 MVC NET 的等效项OnActionExecuting在标准 asp net 中 我以为会是Page Load since OnActionExecuting每次执行操作 或加载页面 时都会调用 但当我尝试使用 Page Loa
  • 活动和片段有什么区别?

    根据我的研究 backstack 的概念及其存在方式存在显着差异 Activity When an activity被放置到backstack of activities用户 只需按一下即可导航回到上一个活动back button Acti
  • 如何在C中检查网络设备状态?

    我想检查网络设备状态 例如混杂模式 基本上就像所示ip a命令 也许有人可以把我推向正确的方向 我想在 Linux 的 C 语言中执行此操作 以便可以使用 Linux 特定的头文件 您需要使用SIOCGIFFLAGSioctl 检索与接口关
  • android:如何从我的应用程序打开另一个应用程序?

    我了解在我自己的应用程序中打开另一个活动时如何使用意图和 startActivity 但是如何启动不同的应用程序 具体来说 如何确定用户的设备上是否安装了所需的应用程序 你如何启动该应用程序 如何将参数传递给该应用程序 如何找到特定应用程序
  • 如何在 R 中加载 MASS 库的数据集部分?

    我正在阅读这本关于统计学习 机器学习和 R 的书 其中一个问题是 首先 加载波士顿数据集 波士顿数据集是 R 中的 MASS 库 library MASS 现在数据集包含在对象中Boston 阅读有关数据集的信息 Boston 我不明白语法
  • Spring MVC 事务控制器

    我正在尝试获取一个 Spring MVC 控制器方法 该方法已用 Transactional 注释 如果在该方法返回之前在客户端拉动网络电缆 则该方法将回滚 我似乎无法让它工作 这是一个示例我想要实现的目标 Transactional ro
  • Python 中出现“意外缩进”该怎么办?

    如何纠正 Python 中的 意外缩进 错误 Python 使用行开头的空格来确定代码块的开始和结束时间 您可能遇到的错误有 意外的缩进 这行代码的开头比前一行有更多的空格 但前一行不是子块的开头 例如 if while and for声明
  • 将形状复制到空白画布(OpenCV、Python)

    import numpy as np import cv2 blank image np zeros 40 40 3 np uint8 blank image fill 255 cv2 imshow i blank image cv2 wa
  • Facebook Feed 对话框移动网址:display=wap 问题

    我正在使用此 url 将我的移动网页定向到 Facebook 墙帖对话框页面 但是我似乎无法获取display wap上班 http m facebook com dialog feed app id
  • 为什么我不能继承 Enum 的子类?

    考虑以下代码 from enum import Enum class SubclassOfEnum Enum x 5 print SubclassOfEnum x class SubSubclassOfEnum SubclassOfEnum
  • Android,如何将CSS应用到WebView中?

    我想使用 WebView 以便向用户显示一些段落 在 XML 中 我编写了以下代码
  • RedirectToLocal() 转到不同的 url

    以下代码片段来自我的 ASP NET MVC 5 应用程序 public ActionResult Ask string id if this User Identity IsAuthenticated string retUrl Requ
  • 自定义验证不起作用 - Yii2-app-basic-Yii2

    我昨天发布了一个关于单选按钮自定义验证的问题单选按钮上的强制文本字段 我得到了答案 但是 这并不是准确的答案 但是 它解决了我的一个问题 实际上 我有 2 个单选按钮 个人 Firm 当选择具有 个人 值的单选按钮时 公司名称文本框不应是强
  • Typescript:具有不同参数的泛型数组

    考虑一个这样调用的函数 func object object1 key someKeyOfObject1 object object2 key someKeyOfObject2 它有一个数组 我想强制执行key字段保存所保存对象的键obje