# @badrap/result 中文文档

规范地址：https://npmcn.com/package/%40badrap/result/

版本：0\.3\.1
npm 元数据更新时间：2025-08-04T14:09:07.390Z
中文译文更新时间：2026-11-07T14:44:54.314Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40badrap/result
原文对照：https://npmcn.com/package/%40badrap/result/?lang=original
项目主页：https://github.com/badrap/result#readme
源码仓库：https://github.com/badrap/result

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：75.6 kB，23 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：\>= 22
- 运行依赖：0 个
- 首次发布：2018-10-18T21:51:50.591Z
- 最新版本发布：2025-08-04T14:09:06.953Z
- 近 30 天下载量：119783（2026-10-08 至 2026-11-06，npm 官方下载统计）
- 已发布版本数：17（近 12 个月 0 个）

## 中文简介

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

## 安装

```sh
npm install @badrap/result
```

也可以使用：`pnpm add @badrap/result`、`yarn add @badrap/result`、`bun add @badrap/result`

## README

# @ badrap/ 结果 [![CI](https://github.com/badrap/result/actions/workflows/ci.yml/badge.svg)](https://github.com/badrap/result/actions/workflows/ci.yml) [![npm](https://img.shields.io/npm/v/@badrap/result.svg)](https://www.npmjs.com/package/@badrap/result)

TypeScript 结果类型从 [鲁斯特的结果](https://doc.rust-lang.org/std/result/) 财务报告和审定财务报表 [哈斯克也一样](http://hackage.haskell.org/package/base/docs/Data-Either.html) 类型。 目标是:

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

## 安装

```sh
$ npm i @badrap/result
```

## 使用量

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

## API 密码

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

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

### 结果.ok/结果.err

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

```ts
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的类型检查器断言这样做是安全的后,可以访问. 这个 **无效** 财务报告和审定财务报表 **是奥克** 属性(见下文)对此有用.

```ts
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 **结果。 错误**。 。 。 .

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

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

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

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

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

### 结果# 撤销

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

```ts
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](https://koajs.com/) 处理器, 使用假想 **验证** 函数返回 a **结果**数字 :

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

### 结果# 图

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

```ts
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")
```

### 结果# 链

```ts
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
```

### 结果。 所有

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

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

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

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

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

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

## 许可证

这个图书馆根据麻省理工学院的许可证颁发执照. 见 [自由主义](https://npmcn.com/package/%40badrap/result/LICENSE)。 。 。 .

## 常见问题

### @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 和提交记录判断。

