0Pricing
TypeScript Academy · 课时

组合效果

使用 pipe 和生成器串联并组合效果。

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

组合效应

效应是值,因此您可以通过组合它们来构建程序。核心工具包括 Effect.pipe、Effect.map、Effect.flatMap 以及基于生成器的 Effect.gen 语法。

pipe:贯穿函数传递

pipe 会让效应从左到右依次经过一系列转换,从而避免深层嵌套。

import { Effect, pipe } from "effect";

const program = pipe(
  Effect.succeed(2),
  Effect.map((n) => n + 1),
  Effect.map((n) => n * 10)
);
// Effect<number, never, never> producing 30

map:转换成功值

Effect.map 会对成功值应用纯函数,同时保持错误通道和要求通道不变。

import { Effect } from "effect";

const doubled = Effect.map(Effect.succeed(21), (n) => n * 2);
// Effect<number, never, never>

flatMap:按顺序执行效应

当下一步本身也是一个效应时,请使用 flatMap(也称为 chain)。它会运行第一个效应,然后将其值传递给一个返回另一个效应的函数。

import { Effect, pipe } from "effect";

const getId = Effect.succeed(1);
const loadUser = (id: number) => Effect.succeed({ id, name: "Ada" });

const program = pipe(getId, Effect.flatMap(loadUser));
// Effect<{ id: number; name: string }, never, never>

map 与 flatMap

当您的函数返回普通值时,请使用 map;当它返回效应时,请使用 flatMap。对返回效应的函数使用 map,会得到嵌套效应。

通道会累积

按顺序执行效应时,它们的错误类型会合并为联合类型,要求也会合并为联合类型。组合后的类型会反映所有可能失败的情况以及所有必需的内容。

// Effect<A, E1, R1> then Effect<B, E2, R2>
// => Effect<B, E1 | E2, R1 | R2>

Effect.gen:生成器语法

Effect.gen 允许您编写按顺序执行的效应代码,使其读起来类似 async/await,并使用 yield* 解包每个效应。

import { Effect } from "effect";

const program = Effect.gen(function* () {
  const id = yield* Effect.succeed(1);
  const user = yield* Effect.succeed({ id, name: "Ada" });
  return user.name;
});
// Effect<string, never, never>

gen 与 pipe

对于带有中间变量的线性多步流程,gen 更清晰;对于简短的转换链,pipe 更出色。两者可以自由互操作。

组合独立效应

Effect.all 会运行多个效应并收集它们的结果,同时累积所有效应的错误和要求。

import { Effect } from "effect";

const both = Effect.all([Effect.succeed(1), Effect.succeed("x")]);
// Effect<[number, string], never, never>

仍然保持惰性

所有这些操作都只是在描述程序。直到您在边界处使用 Effect.runPromise 或 Effect.runSync 运行它,任何操作都不会执行。

import { Effect } from "effect";
// const result = await Effect.runPromise(program);

为什么这很重要

组合让效果变得实用:您可以将小型、带类型的部分组装成大型程序,同时由编译器跟踪每个错误和依赖项。map、flatMap、pipe 和 gen 是 Effect 代码中日常使用的动词。

快速检查

检查您对组合效果的理解。

回顾

您可以使用 map(转换成功值)、flatMap(依次执行返回效果的步骤)、pipe(让值依次经过转换)和 Effect.gen(类似等待的生成器语法)来组合效果。错误通道和需求通道会累积为联合类型,并且在程序执行到边界之前,任何操作都不会运行。

常见问题解答

「组合效果」课时是免费的吗?

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

「组合效果」这节课中我会学到什么?

使用 pipe 和生成器串联并组合效果。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

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

「组合效果」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. 效果系统为何重要
  2. Effect 类型
  3. 组合效果
  4. 错误通道与依赖
← 返回 TypeScript Academy