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

如何为泛型函数类型前置添加参数并实现批量映射?

问题解决方案

一、给泛型函数类型前置参数

可以通过TypeScript的条件类型、参数元组提取和泛型保留特性,定义通用类型来实现:

// 定义通用类型:给函数前置一个指定类型的参数
type PrependFirstArg<F extends (...args: any) => any, Arg> = 
  F extends <T extends any>(...args: infer Args) => infer Return 
    ? <T extends any>(prependedArg: Arg, ...args: Args) => Return 
    : never;

测试示例

type FuncType = <T extends any>(arg: T) => T;
// 推导得到目标类型
type FuncWithPrependedArg = PrependFirstArg<FuncType, any>;
// 最终类型:<T extends any>(prependedArg: any, arg: T) => T

这个类型会自动保留原函数的泛型参数,同时在参数列表最前面插入指定类型的新参数。如果原函数有多个泛型参数(比如<T, U>),写法也能直接适配。

二、给对象中所有函数批量前置参数

这个需求完全可以实现,结合上面的PrependFirstArg和TypeScript映射类型即可:

// 定义映射类型:遍历对象所有函数属性,统一前置参数
type SomeTypeToMap<Obj extends Record<string, (...args: any) => any>, Arg = any> = {
  [K in keyof Obj]: PrependFirstArg<Obj[K], Arg>;
};

测试示例

const funcs = {
    funcA: (arg: string): number => { return 1; },
    funcB: (): string => { return ""; },
    funcC: <T extends string>(arg: T): T => { return arg; },
};

type Funcs = typeof funcs;
// 生成映射后的类型
type MappedFuncs = SomeTypeToMap<Funcs>;

// MappedFuncs的最终类型:
// {
//   funcA: (prependedArg: any, arg: string) => number;
//   funcB: (prependedArg: any) => string;
//   funcC: <T extends string>(prependedArg: any, arg: T) => T;
// }

如果需要自定义前置参数的类型(而非固定any),可以在使用时指定:

// 指定前置参数为string类型
type MappedFuncsWithStringArg = SomeTypeToMap<Funcs, string>;

内容的提问来源于stack exchange,提问作者Wojtek Szałkiewicz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:45:01