TypeScript Academy · 课时

柯里化与部分应用

将多参数函数转换为柯里化形式。

第 2 / 4 课13 个步骤

柯里化与部分应用 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

什么是柯里化

柯里化会将一个接收多个参数的函数转换为一串每次接收一个参数的函数。您不再调用 f(a, b),而是调用 f(a)(b)。

经典示例

这里的 add 接收一个数字,并返回一个等待下一个数字的函数。TypeScript 会自动推断嵌套函数的类型。

const add = (a: number) => (b: number) => a + b;
console.log(add(2)(3)); // 5

为柯里化函数添加类型

显式类型清晰地展示了这条链:一个返回函数的函数。每个箭头对应一个参数。

type Add = (a: number) => (b: number) => number;
const add: Add = a => b => a + b;
console.log(add(10)(5)); // 15

部分应用

部分应用会先固定一部分参数,稍后再提供其余参数。对于柯里化函数来说,这只需调用较少的步骤即可实现。

const add = (a: number) => (b: number) => a + b;
const add10 = add(10); // partially applied
console.log(add10(1), add10(2)); // 11 12

部分应用为何有帮助

您可以从通用函数构建专用函数。add10 是从通用 add 派生出的可复用命名工具,可提高可读性和复用性。

三个参数的柯里化

这种模式可以扩展到任意数量的参数。每一层都会在闭包中捕获一个参数,直到产生最终值。

const clamp = (min: number) => (max: number) => (x: number) =>
  Math.min(Math.max(x, min), max);
const toByte = clamp(0)(255);
console.log(toByte(300), toByte(-5)); // 255 0

非常适合 map 和 filter

柯里化函数可以自然地插入数组方法中,因为 map 需要一个接收一个参数的函数。部分应用正好可以生成这样的函数。

const mul = (a: number) => (b: number) => a * b;
const triple = mul(3);
console.log([1, 2, 3].map(triple)); // [3, 6, 9]

通用柯里化辅助函数

您可以编写一个类型化辅助函数,将接收两个参数的函数进行柯里化。泛型可以保持参数类型和返回类型的精确性。

function curry2<A, B, R>(f: (a: A, b: B) => R) {
  return (a: A) => (b: B) => f(a, b);
}
const join = curry2((a: string, b: string) => a + b);
console.log(join("foo")("bar")); // foobar

闭包捕获参数

柯里化之所以有效,是因为每个返回的函数都会闭包捕获之前的参数。在最终调用使用它们之前,这些值会一直保持有效。

const greet = (greeting: string) => (name: string) =>
  greeting + ", " + name;
const hi = greet("Hi");
console.log(hi("Sam")); // Hi, Sam

何时不应使用柯里化

对每个函数都进行柯里化可能会损害可读性。只有在部分应用确实有用时才使用它,例如配置可复用的辅助函数或组合管道。

柯里化与默认参数

默认参数可以提供默认值,但不能实现分阶段应用。柯里化则能实现真正的部分应用,返回一个可以传递和复用的真实函数。

快速检查

快速检查本课内容。

回顾

柯里化会将 f(a, b) 转换为 f(a)(b),也就是一串以嵌套箭头类型表示的单参数函数。部分应用随后固定前面的参数,借助闭包构建可复用的专用函数。

免费开始

用 AI 导师学习 TypeScript — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
101
课程
352

常见问题解答

「柯里化与部分应用」课时是免费的吗?

是的 — 「柯里化与部分应用」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「柯里化与部分应用」这节课中我会学到什么?

将多参数函数转换为柯里化形式。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「柯里化与部分应用」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 纯函数与不可变性
  2. 柯里化与部分应用
  3. 使用类型进行函数组合
  4. 带类型的 pipe 与 flow 工具
← 返回 TypeScript Academy