You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何实现支持多泛型类型Item的可变参数函数?

TypeScript中实现多类型Item参数的函数

你的代码报错原因是:原函数a<What>要求所有传入的items必须属于同一种Item<What>类型,但你传入的两个对象分别对应不同的T({name: string}和{count: number}),类型无法统一,因此触发类型错误。

以下是两种可行的实现方案:

方案一:宽松的任意Item类型接收

如果只需要允许传入任意符合Item<T>结构的对象,TypeScript仍会检查单个对象的func参数是否匹配自身属性,可以简化函数泛型:

type Item<T> = T & {
  func: (v: T) => void
}

function a(...items: Item<any>[]) {}

a({
  name: "",
  func: (v: {name: string}) => {}
}, {
  count: 0,
  func: (v: {count: number}) => {}
})

方案二:严格的类型绑定检查

如果需要确保每个Item的func参数类型与自身的额外属性完全匹配,同时支持多类型参数,可以使用泛型数组映射:

type Item<T> = T & {
  func: (v: T) => void
}

// 泛型Ts对应每个Item的T类型数组,映射生成对应的Item数组类型
function a<Ts extends any[]>(...items: { [K in keyof Ts]: Item<Ts[K]> }) {}

a({
  name: "",
  func: (v: {name: string}) => {}
}, {
  count: 0,
  func: (v: {count: number}) => {}
})

这种写法会让TypeScript自动推断每个参数对应的T类型,确保单个Item内部的类型一致性,同时允许不同参数使用不同的T类型。

内容的提问来源于stack exchange,提问作者SonMooSans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:55:19