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

如何定义可复用泛型的GeneralZipFunction类型以适配zip与zipObj函数

如何定义可复用泛型的GeneralZipFunction类型以适配zip与zipObj函数

我来帮你搞定这个通用泛型类型的定义,刚好能满足你既要复用泛型参数、又能自定义返回类型,还能给T加约束的需求。

首先,我们可以把GeneralZipFunction定义成一个高阶泛型类型,它允许你指定两个核心配置:

  • TConstraint:用来约束第一个数组元素的类型(默认是unknown,也就是无额外约束)
  • ReturnShape:一个依赖于T和K的泛型类型,用来定义函数的返回结构(默认是zip函数的元组数组类型)

具体的类型定义如下:

type GeneralZipFunction<
  TConstraint = unknown,
  ReturnShape<T, K> = Array<[T, K]>
> = <T extends TConstraint, K>(
  arr1: readonly T[],
  arr2: readonly K[]
) => ReturnShape<T, K>

接下来我们用这个类型分别定义你的两个函数:

1. 定义zip函数

直接使用默认的泛型参数即可,完全匹配你原来的zip函数类型:

const zip: GeneralZipFunction = (arr1, arr2) => arr1.map((item, idx) => [item, arr2[idx]]);

2. 定义zipObj函数

这里我们需要:

  • 指定TConstraint为string,确保第一个数组的元素都是字符串类型
  • 把ReturnShape改成对象类型,你可以选择两种方式:
    • 宽松版:返回键为string的对象(和你原函数一致)
    • 精确版:返回键为原数组字面量类型的对象(类型更严格)

宽松版实现

const zipObj: GeneralZipFunction<string, { [key: string]: K }> = (arr1, arr2) =>
  Object.fromEntries(zip(arr1, arr2));

精确版实现(更推荐)

如果想让返回对象的键严格对应输入数组的字面量类型(比如你的names是const断言的数组),可以这样写:

const zipObj: GeneralZipFunction<string, { [key in T]: K }> = (arr1, arr2) =>
  Object.fromEntries(zip(arr1, arr2)) as { [key in typeof arr1[number]]: typeof arr2[number] };

这里的类型断言是因为Object.fromEntries的默认返回类型比较宽松,我们需要手动把它校正成更精确的类型。

最后验证一下你的使用示例,类型推导完全正常:

const names = ['bob', 'sally', 'dave'] as const;
const ages = [50, 40, 30] as const;

const myEntries = zip(names, ages); // 类型:[['bob', 50], ['sally', 40], ['dave', 30]]
const myObj = zipObj(names, ages); // 精确版下类型:{ bob: 50; sally: 40; dave: 30 }

备注:内容来源于stack exchange,提问作者diplosaurus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 09:33:03