如何移除TypeScript泛型函数的第一个参数
解决泛型函数移除首个参数后保留类型推断的问题
需求是移除带泛型参数函数的第一个参数,期望实现如下效果:
type GenericFunc = <T extends string | number>(c: any, p: T) => T; type GenericFuncWithoutFirst = OmitFirstArg<GenericFunc> // 目标:<T extends string | number>(p: T) => T;
之前找到的常规方案:
type OmitFirstArg<F> = F extends (x: any, ...args: infer P) => infer R ? (...args: P) => R : never;
但该方案会丢失原函数的泛型类型推断能力。
可行的通用解决方案
使用TypeScript 4.7及以上版本支持的泛型参数展开语法,直接保留原函数的泛型参数列表:
type OmitFirstArg<F> = F extends <...T>(_: any, ...args: infer P) => infer R ? <...T>(...args: P) => R : never;
效果验证
type GenericFunc = <T extends string | number>(c: any, p: T) => T; type GenericFuncWithoutFirst = OmitFirstArg<GenericFunc>; // 实际得到:<T extends string | number>(p: T) => T // 测试类型推断 const wrappedFunc: GenericFuncWithoutFirst = (p) => p; const numResult = wrappedFunc(456); // 类型自动推断为number const strResult = wrappedFunc("test"); // 类型自动推断为string
这个方案通过...T推断并保留原函数的所有泛型参数,同时移除第一个参数,完美保留了原函数的泛型类型推断能力。
内容的提问来源于stack exchange,提问作者Harry Payne
相关产品推荐
相关产品推荐

