铁路导向编程
在无需 try/catch 的情况下,串联可能失败的操作。
铁路导向编程 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
铁路比喻
铁路导向编程将计算过程想象成两条并行轨道:成功轨道和失败轨道。一旦切换到失败轨道,就会一直留在那里,跳过后续步骤。
串联结果类型函数
每个步骤都接收一个值并返回一个 Result。我们希望将这些步骤连接起来,使第一次失败就能让链短路,并一直传递到最后。
type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };
const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });
const err = <E>(error: E): Result<never, E> => ({ ok: false, error });map:转换成功值
map 会在结果类型为成功时对其中的值应用普通函数,并原样传递失败结果。它会继续沿着成功轨道运行。
function map<T, U, E>(r: Result<T, E>, f: (t: T) => U): Result<U, E> {
return r.ok ? ok(f(r.value)) : r;
}
console.log(map(ok(2), n => n + 1)); // { ok: true, value: 3 }flatMap:串联可能失败的步骤
当下一步本身返回一个结果类型时,请使用 flatMap(也称为 andThen)。它可以避免结果类型嵌套,并在失败时使链短路。
function flatMap<T, U, E>(r: Result<T, E>, f: (t: T) => Result<U, E>): Result<U, E> {
return r.ok ? f(r.value) : r;
}为什么不是使用 flatMap 而是 map
如果对一个返回结果类型的函数使用 map,您会得到 Result<Result<U,E>,E>。flatMap 会将其展平一层,从而保留单一的结果类型。
在第一个错误处短路
一旦某个步骤返回 err,后续每个 flatMap 都会原样传递它。剩余步骤永远不会运行,正如切换到失败轨道一样。
const start = err("boom") as Result<number, string>;
const out = flatMap(start, n => ok(n + 1));
console.log(out); // { ok: false, error: "boom" }构建流水线
组合多个验证步骤,每个步骤都返回一个结果类型。第一次失败会成为流水线的结果;如果全部通过,成功值就会流向末端。
function parseNum(s: string): Result<number, string> {
const n = Number(s);
return Number.isNaN(n) ? err("not a number") : ok(n);
}
function positive(n: number): Result<number, string> {
return n > 0 ? ok(n) : err("must be positive");
}运行流水线
串联 flatMap 会让值依次经过每个可能失败的步骤。任何位置发生失败都会停止整个链,并暴露该错误。
const good = flatMap(parseNum("5"), positive);
console.log(good); // { ok: true, value: 5 }
const bad = flatMap(parseNum("-3"), positive);
console.log(bad); // { ok: false, error: "must be positive" }组合 map 与 flatMap
对可能失败的步骤使用 flatMap,对纯转换使用 map。二者结合后,可以让正常路径保持线性,同时自动处理错误。
const result = map(flatMap(parseNum("10"), positive), n => n * 2);
console.log(result); // { ok: true, value: 20 }无需使用 try/catch
整个流水线通过值表达成功与失败。无需使用 try/catch,并且每一步的类型都会使错误路径明确且无法回避。
为什么这种方式易于扩展
铁路导向代码可以让复杂工作流保持清晰:每个步骤都小而纯,错误会自动传播,新增步骤也不会使现有错误处理变得复杂。
快速检查
快速检查本课内容。
回顾
铁路导向编程使用 map(转换成功值)以及 flatMap/andThen(串联可能失败的步骤并展平嵌套结果类型)来串联返回 Result 的步骤。第一个 err 会使后续步骤短路,并在没有 try/catch 的情况下将错误传播到末端。
用 AI 导师学习 TypeScript — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 101
- 课程
- 352
常见问题解答
「铁路导向编程」课时是免费的吗?
是的 — 「铁路导向编程」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「铁路导向编程」这节课中我会学到什么?
在无需 try/catch 的情况下,串联可能失败的操作。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「铁路导向编程」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。