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

TypeScript柯里化实现错误排查及类型定义咨询

TypeScript柯里化实现问题解答

原始JavaScript柯里化示例

function curry(f) { // curry(f) does the currying transform
  return function(a) {
    return function(b) {
      return f(a, b);
    };
  };
}

// usage
function sum(a, b) {
  return a + b;
}

let curriedSum = curry(sum);

console.log( curriedSum(1)(2) ); // 3

你的错误TypeScript实现

function curry(f:any){
    return function(a:number) {
        return function (b:number) {
            return function f(a :number, b: number){};
        };
    };
}

function sum (a: number,b: number){
    return a+b;
}

let curriedSum = curry(sum);

console.log(curriedSum(1)(2));

1. TypeScript示例中的错误

  • 核心逻辑错误:最内层函数没有调用传入的原函数f(a, b),而是重新定义了一个空函数function f(a :number, b: number){},导致最终返回的是这个空函数而非计算结果,这就是输出[Function: f]的直接原因。
  • 类型局限性:硬编码参数类型为number,使curry函数只能处理双参数数值函数,完全丢失了原JavaScript版本的通用性。
  • 类型不安全:使用any作为参数f的类型,彻底放弃了TypeScript的类型检查能力,违背了使用TS的初衷。

2. 参数f的正确类型

应该使用泛型函数类型来定义,支持任意双参数函数,类型定义为:

<T, U, R>(f: (a: T, b: U) => R)

其中:

  • T代表原函数第一个参数的类型
  • U代表原函数第二个参数的类型
  • R代表原函数的返回值类型

这种定义方式能让curry函数适配任意类型的双参数函数,同时保留完整的类型检查能力。

3. 各函数的返回类型定义

  • curry函数的返回类型:一个接受T类型参数、返回另一个函数的类型,这个返回的函数接受U类型参数,最终返回R类型值,即(a: T) => (b: U) => R。
  • 内层嵌套函数也可以显式指定返回类型,让类型声明更清晰直观。

修正后的TypeScript实现

function curry<T, U, R>(f: (a: T, b: U) => R): (a: T) => (b: U) => R {
    return function(a: T): (b: U) => R {
        return function(b: U): R {
            return f(a, b);
        };
    };
}

// 数值求和示例
function sum(a: number, b: number): number {
    return a + b;
}

let curriedSum = curry(sum);
console.log(curriedSum(1)(2)); // 3

// 字符串拼接示例(验证通用性)
function concat(str1: string, str2: string): string {
    return str1 + str2;
}

let curriedConcat = curry(concat);
console.log(curriedConcat("Hello ")("World")); // Hello World

内容的提问来源于stack exchange,提问作者lopah elision

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:10:26