@badrap/result

中文文档
0.3.1发布于 2025/08/04MITTypeScriptESM + CJS零依赖构建来源已验证近 30 天下载 12万

TypeScript 结果类型取自 Rust 的结果和 Haskell 的任意类型

中文使用文档
文档目录10 节
  1. 安装
  2. 使用量
  3. API 密码
  4. 结果.ok/结果.err
  5. 结果#isOk/结果#isErr
  6. 结果# 撤销
  7. 结果# 图
  8. 结果# 链
  9. 结果。 所有
  10. 许可证

@ badrap/ 结果 CI npm

TypeScript 结果类型从 鲁斯特的结果 财务报告和审定财务报表 哈斯克也一样 类型。 目标是:

  • 小型平面平面: 混合和匹配 Rust's Result and Haskell's either type, 但修改后使体验 TypeScript-y (TypeScriptic? TypeScriptalicious?) 。 当然,这是相当主观的.
  • 编码错误应丢出: 当 结果# 图 财务报告和审定财务报表 结果# 链 在一起有点像 答应吧 但不同之处在于 他们不隐含地将错误包裹在回调中.
  • 体能学但安全: 利用TypeScript的类型推论,使常见案例简单,同时保持类型安全. 这也有助于在Visual Studio代码等方面获得良好的编辑体验.

安装

$ npm i @badrap/result

使用量

import { Result } from "@badrap/result";

API 密码

结果<T, E 扩展出错 = 出错> 是一个类型,它既可以包入一个由 successful 计算结果的值,也可以包入类型 T级,或类型错误 页:1 表示计算失败.

该类型实际上是两种类型的结合: 结果。 行 <T, E> 语句 包罗成功值 结果. rr<T, E> 将错误包起来.

结果.ok/结果.err

结果 返回一个新的 结果。 还好 覆盖给定的值,同时 结果. err 返回一个新的 结果。 错误 覆盖给定错误.

const res = Result.ok(1);
res.isOk; // true

const res = Result.err(new Error());
res.isOk; // false

const res = Result.err(); // functionally equal to Result.err(new Error())
res.isOk; // false

结果。 还好 拥有额外的财产 价值 包含被包裹的值。 同样, 结果。 错误 拥有财产 错误 包含被包裹的错误。 在向TypeScript的类型检查器断言这样做是安全的后,可以访问. 这个 无效 财务报告和审定财务报表 是奥克 属性(见下文)对此有用.

const res = Math.random() < 0.5 ? Result.ok(1) : Result.err(new Error("oh no"));

if (res.isErr) {
  // TypeScript now knows that res is a Result.Err, and we can access res.error
  res.error; // Error("oh no")
}

if (res.isOk) {
  // TypeScript now knows that res is a Result.Ok, and we can access res.value
  res.value; // 1
}

结果#isOk/结果#isErr

结果# isOk 财务报告和审定财务报表 结果# isErr 是互补的只读属性. 是奥克 实值 true 页:1 结果。 还好 财务报告和审定财务报表 false 页:1 结果。 错误。 。 。 .

const ok = Result.ok(1);
ok.isOk; // true

const err = Result.err(new Error());
err.isOk; // false

无效 反向为 是奥克数字 : false 页:1 结果。 还好 财务报告和审定财务报表 true 页:1 结果。 错误。 。 。 .

const ok = Result.ok(1);
ok.isErr; // false

const err = Result.err(new Error());
err.isErr; // true

结果# 撤销

返回包裹值 结果。 还好 并抛出包裹的错误 结果。 错误。 。 。 . 它可以被修改为提供函数来将值和出错映射到某个值.

const ok = Result.ok(1);
const err = Result.err(new Error("oh no"));

ok.unwrap(); // 1
err.unwrap(); // throws Error("oh no")

ok.unwrap((value) => value + 1); // 2
err.unwrap((value) => value + 2); // throws Error("oh no")

ok.unwrap(
  (value) => value + 1,
  (error) => 0,
); // 2
err.unwrap(
  (value) => value + 2,
  (error) => 0,
); // 0

作为小小的额外方便,调用的结果类型不必相同. 这里有个例子 科亚.js 处理器, 使用假想 验证 函数返回 a 结果数字 :

app.use(async ctx =>
  await validate(ctx.request.body).unwrap(
    async (value: any) => {
      ...
    },
    error => {
      ctx.status = 422;
      ctx.body = {
        message: "validation failed"
      };
    }
  )
);

结果# 图

返回一个新的 结果 已应用特定功能/功能的 到被包好的值和错误.

const ok = Result.ok(1);
const err = Result.err(new Error("oh no"));

ok.map((value) => value + 1).unwrap(); // 2
err.map((value) => value + 1).unwrap(); // throws Error("oh no")

ok.map(
  (value) => value + 1,
  (error) => new Error("mapped"),
).unwrap(); // 2
err
  .map(
    (value) => value + 1,
    (error) => new Error("mapped"),
  )
  .unwrap(); // throws Error("mapped")

结果# 链

const ok = Result.ok(1);
const err = Result.err(new Error("oh no"));

ok.chain((value) => Result.ok(value + 1)).unwrap(); // 2
err.chain((value) => Result.ok(value + 1)).unwrap(); // throws Error("oh no")

ok.chain(
  (value) => Result.ok(value + 1),
  (error) => Result.ok(0),
).unwrap(); // 2
err
  .chain(
    (value) => Result.ok(value + 1),
    (error) => Result.ok(0),
  )
  .unwrap(); // 0

结果。 所有

返回一个新的 结果 所包裹的值为 收集输入数组的包裹值.

Result.all([Result.ok(1), Result.ok("test")]).unwrap(); // [1, "test"]

如果输入结果中的任何结果包成一个错误,则该结果按正值返回.

Result.all([Result.ok(1), Result.err(new Error("oh no"))]).unwrap(); // throws Error("oh no")

非阵列对象也可以作为参数给出. 这样的话 包裹 输出值也是一个对象.

Result.all({
  x: Result.ok(1),
  y: Result.ok("test"),
}).unwrap(); // { x: 1, y: "test" }

许可证

这个图书馆根据麻省理工学院的许可证颁发执照. 见 自由主义。 。 。 .

版本与发布记录

@badrap/result 共发布 17 个版本,首次发布于 2018/10/19;过去 12 个月发布了 0 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.3.1latest2025/08/041.3 年前
0.3.02025/08/041.3 年前
0.2.132022/10/204 年前
0.2.122022/05/054 年前
0.2.112022/05/054 年前
0.2.102022/05/054 年前

关于 @badrap/result 的常见问题

@badrap/result 是什么?

TypeScript 结果类型取自 Rust 的结果和 Haskell 的任意类型

如何安装 @badrap/result?

在项目目录运行 npm install @badrap/result,或使用 pnpm add / yarn add / bun add。

@badrap/result 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@badrap/result 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@badrap/result 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@badrap/result 可以商用吗?

@badrap/result 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@badrap/result 的下载量有多少?

根据 npm 官方下载统计,@badrap/result 在 2026/10/08 – 2026/11/06 这 30 天内被下载 119,783 次,日均约 3,993 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@badrap/result 还在维护吗?

最新版本 0.3.1 发布于 2025/08/04(1.3 年前);至今共发布 17 个版本,其中过去 12 个月发布了 0 个;首次发布于 2018/10/19。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。