如何定义可复用泛型的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
相关产品推荐
相关产品推荐

