如何为泛型函数类型前置添加参数并实现批量映射?
问题解决方案
一、给泛型函数类型前置参数
可以通过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
相关产品推荐
相关产品推荐

