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
相关产品推荐
相关产品推荐

