组合效果
使用 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 30map:转换成功值
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 反馈 — 无需本地设置。