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

如何实现自动移除首个参数的TypeScript泛型PartialFunc?

解决方案:自动推导的PartialFunc泛型

当然可以实现!你想要的PartialFunc泛型完全可以通过TypeScript的条件类型和类型推断来自动推导,不需要手动重复指定参数和返回值类型。

核心泛型定义

直接利用TypeScript的内置类型推断能力,我们可以写出一个通用的PartialFunc类型,它会自动提取目标函数的签名并移除第一个参数:

type PartialFunc<Func extends (...args: any[]) => any> = 
  Func extends (first: infer TFirst, ...rest: infer TRest) => infer TReturn 
    ? (...args: TRest) => TReturn 
    : never;

用法演示

用你提供的例子测试,完全符合你的期望:

function myFunc(a: number, b: number): number { return a + b }
let partFunc: PartialFunc<typeof myFunc>; 
// 此时partFunc的类型会自动推导为:(b: number) => number

// 赋值完全符合类型检查
partFunc = (b) => myFunc(42, b);

// 如果传入错误类型,TypeScript会直接报错(比如把b改成string)
// partFunc = (b: string) => myFunc(42, b); // ❌ 类型不匹配

原理说明

这个泛型的工作逻辑很清晰:

  1. 首先约束Func必须是一个函数类型((...args: any[]) => any)
  2. 通过infer关键字,从目标函数中分别推断出第一个参数(TFirst)、剩余参数列表(TRest)和返回值类型(TReturn)
  3. 如果目标函数符合“至少有一个参数”的结构,就返回一个新的函数类型:只接收剩余参数TRest,返回TReturn;如果是无参函数,就返回never(避免无意义的偏函数)

适配你的React-Redux场景

针对你提到的react-redux绑定场景,这个泛型同样好用。比如你有一个带多个参数的action creator:

const updateUser = (userId: string, newData: { name?: string; age?: number }): { type: 'UPDATE_USER', payload: { userId: string; newData: { name?: string; age?: number } } } => {
  return { type: 'UPDATE_USER', payload: { userId, newData } };
};

// 固定第一个参数(比如从store中获取当前用户ID),得到偏函数
const updateCurrentUser: PartialFunc<typeof updateUser> = (newData) => updateUser('current-user-id', newData);
// 自动推导类型:(newData: { name?: string; age?: number; }) => { type: 'UPDATE_USER'; payload: { userId: string; newData: { name?: string; age?: number; }; }; }

这样你就可以轻松绑定store中的参数到action dispatcher,同时保留完整的类型检查,不需要手动重复编写类型定义。

内容的提问来源于stack exchange,提问作者Igor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:16