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

如何实现可扩展泛型函数参数的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:27:43