如何让包装后的reduce函数返回正确的Set<1>类型?
问题:如何让reduce函数返回Set<1>类型?
原代码如下:
const toSet = <const V>(acc=new Set<V>(),v:V) =>{ acc.add(v); return acc; } const set = toSet(undefined,1); // Set<1> 类型正确 const reduce = <NextReducer extends (acc:any,value:any)=>any>(nextReducer:NextReducer) => (acc: unknown, value: unknown) => nextReducer(acc, value); const reduced = reduce(toSet)(undefined,1); // 当前为any类型,期望返回Set<1>
直接调用toSet可正确返回Set<1>类型,但通过reduce函数包装后调用,返回类型变为any,需修改reduce函数使其返回正确的Set<1>类型。
解决方案
修改reduce函数的泛型定义,利用TypeScript的Parameters和ReturnType工具类型复用传入reducer的参数与返回类型,避免宽泛类型导致的类型丢失:
const reduce = <R extends (acc: unknown, value: unknown) => unknown>(nextReducer: R) => (acc: Parameters<R>[0], value: Parameters<R>[1]): ReturnType<R> => nextReducer(acc, value);
修改后调用示例:
const reduced = reduce(toSet)(undefined, 1); // 类型自动推导为Set<1>,符合期望
说明
原reduce函数用any和unknown模糊了参数类型,导致TypeScript无法追踪toSet的具体类型信息。修改后的代码通过工具类型精准提取传入reducer的参数和返回类型,让TypeScript能准确推导最终返回的类型。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

