0Pricing
TypeScript Academy · 课时

结果类型建模

使用 Result 将成功和失败表示为数据。

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

结果类型

结果类型用于表示一个操作要么成功并返回值,要么失败并返回错误;它是一种可返回而非抛出的判别联合。

定义结果类型

经典结构使用 ok 作为判别字段。当 ok 为 true 时存在 value;当它为 false 时存在 error。

type Result<T, E> =
  | { ok: true; value: T }
  | { ok: false; error: E };

构造辅助函数

使用简短的 ok 和 err 辅助函数可以简洁清晰地构造结果,而不必每次都手写对象字面量。

const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });
const err = <E>(error: E): Result<never, E> => ({ ok: false, error });

返回结果类型

可能失败的函数会返回 ok(value) 或 err(error)。返回类型会向每个调用方明确说明这两种可能性。

function divide(a: number, b: number): Result<number, string> {
  return b === 0 ? err("divide by zero") : ok(a / b);
}

基于 ok 进行类型收窄

检查 result.ok 会收窄联合类型。在 true 分支中,TypeScript 知道 value 存在;在 false 分支中,它知道 error 存在。

const r = divide(10, 2);
if (r.ok) console.log(r.value); // 5
else console.log(r.error);

判别字段驱动安全性

ok 字段是判别字段,它让编译器能够选择正确的分支。在证明 ok 为 true 之前,您无法访问 value。

const r = divide(1, 0);
// r.value here is a type error until we check r.ok
if (!r.ok) console.log("err:", r.error);

类型化错误

错误可以比字符串包含更丰富的信息。使用类型化的错误联合后,调用方可以在类型收窄后精确处理每一种错误。

type DivErr = { kind: "zero" } | { kind: "overflow" };
function div(a: number, b: number): Result<number, DivErr> {
  if (b === 0) return err({ kind: "zero" });
  return ok(a / b);
}

穷举处理错误

由于错误类型是一个联合类型,因此可以检查基于其判别字段的 switch 是否涵盖所有情况,确保每一种失败模式都得到处理。

const r = div(1, 0);
if (!r.ok) {
  switch (r.error.kind) {
    case "zero": console.log("no zero"); break;
    case "overflow": console.log("too big"); break;
  }
}

默认值辅助函数

有时您只需要获取值,或者在失败时使用备用值。简短的 unwrapOr 读起来很清晰,也能让失败处理保持在局部范围内。

function unwrapOr<T, E>(r: Result<T, E>, fallback: T): T {
  return r.ok ? r.value : fallback;
}
console.log(unwrapOr(divide(1, 0), -1)); // -1

结果类型与抛出异常

结果类型将失败纳入返回类型,因此调用方必须处理它。代价是代码更加明确;对于预期中的错误,这通常是值得的。

完整示例

将这些内容结合起来:定义辅助函数、返回结果,并在使用前进行类型收窄。编译器会确保错误分支得到处理。

function safeParse(s: string): Result<number, string> {
  const n = Number(s);
  return Number.isNaN(n) ? err("NaN") : ok(n);
}
const p = safeParse("42");
console.log(p.ok ? p.value : p.error); // 42

快速检查

快速检查本课内容。

回顾

结果类型<T, E> 是一个判别联合:{ ok: true; value } 或 { ok: false; error }。使用 ok/err 辅助函数构造它,并根据 ok 进行类型收窄,以安全访问 value 或 error;类型化错误则支持穷举处理。

常见问题解答

「结果类型建模」课时是免费的吗?

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

「结果类型建模」这节课中我会学到什么?

使用 Result 将成功和失败表示为数据。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

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

「结果类型建模」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. 抛出错误的问题
  2. 结果类型建模
  3. Option 与 Maybe 类型
  4. 铁路导向编程
← 返回 TypeScript Academy