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
相关产品推荐
相关产品推荐

