evercatch

中文文档
0.12.0发布于 2026/11/03MITESM + CJS零依赖构建来源已验证

没有更多未捕获的错误

中文使用文档
文档目录9 节
  1. 结果元组
  2. 抓住抛来的东西
  3. 自定义错误类型
  4. 打开
  5. 作曲
  6. 推断类型
  7. 名称空间
  8. 文档
  9. 许可证

Evercatch

Version Downloads Minzipped size

没有更多未被发现的错误!

Evercatch是一个小型的、不依赖的TypeScript库,它可以转换抛出的错误 到的值。错误成为函数返回类型的一部分,因此编译器 告诉您它们在哪里,并拒绝让您读取未检查的值 然而。

npm install evercatch
# or
yarn add evercatch
# or
pnpm add evercatch

结果元组

所有的东西都建立在一个类型上:的只读元组 [error, value]。

type Result<T, E> = readonly [null, T] | readonly [E, null];

解构它,检查错误,TypeScript就会为你缩小值:

import { err, ok, type Result } from "evercatch";

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

const [error, value] = divide(10, 2);

if (error) {
  console.error(error.message);
} else {
  console.log(value); // number — narrowed, not number | null
}

null 在错误槽中表示“此结果是正确的”,因此永远不会出现错误 nullish。标准库中的每个错误类型都被限制为拒绝 null 和 undefined 在编译时。

抓住抛来的东西

包装可能抛出的调用并返回结果。

import { fromPromise, resultFrom } from "evercatch";

const [parseError, config] = resultFrom(() => JSON.parse(raw));

const [fetchError, response] = await fromPromise(
  fetch("https://api.example.com/data"),
);

或者包装一次函数并重用安全版本:

import { fromAsyncThrowable, fromThrowable } from "evercatch";

const safeParse = fromThrowable(JSON.parse);
const safeFetch = fromAsyncThrowable(fetch);

const [error, data] = safeParse(raw);
const [fetchError, response] = await safeFetch("https://api.example.com/data");

任何扔出来的东西都不是 Error 封装在一个中,带有原始值 作为 cause。

自定义错误类型

每个捕获函数都是可选的 mapErr 将捕获值转换为 您选择的错误类型—字符串联合、标记对象、您自己的错误 类。无论返回什么,都将成为结果的错误类型。

import { fromPromise } from "evercatch";

type FetchError = "NETWORK_ERROR" | "TIMEOUT";

const [error, response] = await fromPromise(
  fetch("https://api.example.com/data"),
  (e): FetchError => (e instanceof DOMException ? "TIMEOUT" : "NETWORK_ERROR"),
);

if (error === "TIMEOUT") {
  // ...
}

打开

如果您不想在调用站点处理错误,请使用 一个后撤,或者抛球。

import { unwrapOr, unwrapOrElse, unwrapOrThrow } from "evercatch";

unwrapOr(divide(10, 0), 0); // 0
unwrapOrElse(divide(10, 0), (error) => error.message.length); // computed
unwrapOrThrow(divide(10, 0)); // throws the error

异步变量取a Promise 并返回一个承诺: unwrapAsyncOr, unwrapAsyncOrElse 和 unwrapAsyncOrThrow。

作曲

早点回来,成绩就好。错误作为值向上传播,所以a 可能失败的函数有一个签名说明了这一点。

import { err, fromPromise, ok, type ResultAsync } from "evercatch";
import { auth } from "./auth";

async function fetchUserData(): ResultAsync<UserData, Error> {
  const [authError, user] = await fromPromise(auth());
  if (authError) {
    return err(authError);
  }

  const [fetchError, response] = await fromPromise(
    fetch(`https://api.example.com/user/${user.id}`),
  );
  if (fetchError) {
    return err(fetchError);
  }
  if (!response.ok) {
    return err(new Error("Failed to fetch user data"));
  }

  return await fromPromise(response.json());
}

推断类型

InferOk 和 InferErr 从结果中提取值和错误类型 异步结果,或者返回两者的函数,因此您不必拼写 他们出去了两次。

import { fromThrowable, type InferErr, type InferOk } from "evercatch";

const safeParse = fromThrowable((raw: string): Config => JSON.parse(raw));

type Parsed = InferOk<typeof safeParse>; // Config
type ParseError = InferErr<typeof safeParse>; // Error

// Works on the async function from the section above, too
type FetchUserError = InferErr<typeof fetchUserData>; // Error
type FetchUserResult = InferOk<ReturnType<typeof fetchUserData>>; // UserData

承诺为您打开包装,并且永远不会失败的结果具有错误 类型 never。

名称空间

相同的函数也按照它们使用的类型分组,这使得 在呼叫站点查找较短的名称。这纯粹是一个偏好问题 名称空间成员和独立导出是相同的函数。

import { Result, ResultAsync, ResultAsyncFn, ResultFn } from "evercatch";

Result.ok(42);
Result.from(() => JSON.parse(raw));
Result.unwrapOr(someResult, 0);

await ResultAsync.from(fetch(url));

const safeParse = ResultFn.from(JSON.parse);
const safeFetch = ResultAsyncFn.from(fetch);

请注意, Result, ResultAsync, ResultFn 和 ResultAsyncFn 两个都是吗? 类型和值,因此一次导入就可以同时获得这两个值。

文档

完整API参考: fransek.github.io / evercatch

许可证

麻省理工学院

版本与发布记录

evercatch 共发布 15 个版本,首次发布于 2025/06/11;过去 12 个月发布了 5 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.12.0latest2026/11/03今天
0.11.02026/09/171 个月前
0.10.02026/06/244 个月前
0.9.02025/11/2511 个月前
0.8.02025/11/1111 个月前
0.7.02025/10/111.1 年前

关于 evercatch 的常见问题

evercatch 是什么?

没有更多未捕获的错误

如何安装 evercatch?

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

evercatch 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/evercatch 是否存在。

evercatch 支持 ESM 还是 CommonJS?

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

evercatch 可以商用吗?

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

evercatch 还在维护吗?

最新版本 0.12.0 发布于 2026/11/03(今天);至今共发布 15 个版本,其中过去 12 个月发布了 5 个;首次发布于 2025/06/11。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。