如何实现可扩展泛型函数参数的TypeScript类型
解决TypeScript泛型函数扩展参数的类型问题
原实现的ExtendFunction无法正确处理泛型函数,因为Parameters<TFunction>和ReturnType<TFunction>会直接解析泛型函数的实例化类型,导致泛型参数丢失,类型推断错误。
可行实现
使用TypeScript 4.7+支持的可变泛型参数语法,保留原函数的泛型签名,同时拼接额外参数:
export type ExtendFunction<Fn extends (...args: any) => any, ExtraArgs extends any[]> = Fn extends <...G>(...args: infer Args) => infer Ret ? <...G>(...args: [...Args, ...ExtraArgs]) => Ret : (...args: [...Parameters<Fn>, ...ExtraArgs]) => ReturnType<Fn>;
验证示例
泛型函数场景
function sourceFunction<T>(a: T, b: string): T { return a; }; const extendedFunction: ExtendFunction<typeof sourceFunction, [boolean?]> = (a, b, flag) => { // a: T, b: string, flag: boolean | undefined return a; // 返回值类型为T,符合预期 }
非泛型函数场景
function sourceFunction(a: number, b: string): number { return a; }; const extendedFunction: ExtendFunction<typeof sourceFunction, [boolean?]> = (a, b, flag) => { // a: number, b: string, flag: boolean | undefined return a; }
注意事项
- 该实现要求TypeScript版本≥4.7,因为用到了
<...G>可变泛型参数的捕获语法。 - 类型会自动识别原函数是否为泛型函数,保留所有泛型参数,确保扩展后的函数逻辑与原函数泛型规则一致。
内容的提问来源于stack exchange,提问作者proton
相关产品推荐
相关产品推荐

