0Pricing
TypeScript Academy · 课时

使用类型进行函数组合

组合函数,同时保留类型安全性。

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

什么是函数组合

函数组合会将小函数组合成一个更大的函数。compose(f, g) 会生成一个函数,先应用 g,再将结果传给 f。

核心定义

从数学上看,compose(f, g)(x) = f(g(x))。函数按从右向左的顺序运行:最右侧的函数最先运行。

const compose = (f: (n: number) => number, g: (n: number) => number) =>
  (x: number) => f(g(x));
const inc = (n: number) => n + 1;
const dbl = (n: number) => n * 2;
console.log(compose(inc, dbl)(5)); // 11 (5*2 then +1)

从右向左的顺序

顺序很重要。compose(inc, dbl) 会先将值加一,再将其加倍;而 compose(dbl, inc) 会先加倍,再加一。请从内向外阅读函数组合。

console.log(compose(dbl, inc)(5)); // 12 (5+1 then *2)

使用泛型为组合添加类型

泛型允许输入类型和输出类型不同。g 将 A 映射为 B,f 将 B 映射为 C,因此结果会将 A 映射为 C。

function compose<A, B, C>(f: (b: B) => C, g: (a: A) => B): (a: A) => C {
  return a => f(g(a));
}

沿途改变类型

由于泛型链为 A -> B -> C,组合可以将一个值转换为多种形态,例如从字符串转换为数字,再转换回字符串。

const length = (s: string) => s.length;
const toStr = (n: number) => "len=" + n;
const describe = compose(toStr, length);
console.log(describe("hello")); // len=5

类型边界必须匹配

g 的输出必须与 f 的输入匹配。如果二者不一致,编译器就会拒绝该组合,从而及早发现连接错误。

// compose(length, toStr) would error:
// toStr returns string, length expects string -> ok here,
// but mismatched pairs are flagged by the compiler.

组合三个函数

您可以嵌套组合,也可以编写一个接收三个参数的版本。无论采用哪种方式,从右向左的规则都适用。

const compose3 = <A, B, C, D>(
  f: (c: C) => D, g: (b: B) => C, h: (a: A) => B
) => (a: A): D => f(g(h(a)));
const inc = (n: number) => n + 1;
const dbl = (n: number) => n * 2;
const neg = (n: number) => -n;
console.log(compose3(neg, dbl, inc)(3)); // -8

组合构建管道

通过组合微小的纯函数,您可以以声明式方式组装复杂的转换。每个部分都能单独测试。

const trim = (s: string) => s.trim();
const upper = (s: string) => s.toUpperCase();
const clean = compose(upper, trim);
console.log(clean("  hi ")); // HI

纯函数为何最适合组合

组合假设每个函数只依赖自己的输入。纯函数保证了这一点,因此组合它们会产生另一个可预测的纯函数。

compose 与管道

compose 按从右向左的顺序运行,与数学记号一致。许多人更喜欢从左向右阅读,而 pipe 正是这样提供的,我们将在下一节介绍它。

保持各部分简小

当每个函数只完成一件细小的事情时,组合最能发挥优势。小巧、命名清晰的纯步骤会让组合后的管道自解释且易于重新排列。

快速检查

快速检查本课内容。

回顾

compose(f, g)(x) = f(g(x)) 按从右向左的顺序运行。泛型类型链 A -> B -> C 要求 g 的输出与 f 的输入匹配,使编译器能够验证由小型纯函数组成的管道。

常见问题解答

「使用类型进行函数组合」课时是免费的吗?

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

「使用类型进行函数组合」这节课中我会学到什么?

组合函数,同时保留类型安全性。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

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

「使用类型进行函数组合」课时需要多长时间?

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

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

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

此课程中的所有课时

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