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

如何让包装后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:40:57