如何实现自动移除首个参数的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); // ❌ 类型不匹配
原理说明
这个泛型的工作逻辑很清晰:
- 首先约束
Func必须是一个函数类型((...args: any[]) => any) - 通过
infer关键字,从目标函数中分别推断出第一个参数(TFirst)、剩余参数列表(TRest)和返回值类型(TReturn) - 如果目标函数符合“至少有一个参数”的结构,就返回一个新的函数类型:只接收剩余参数
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
相关产品推荐
相关产品推荐

