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

如何移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:36:25