@asleepace/try

中文文档
0.2.1发布于 2025/04/27MITTypeScriptES Module零依赖近 30 天下载 4.3万

用于例外处理和错误的脚本工具.

中文使用文档
文档目录23 节
  1. 安装
  2. 快速启动
  3. 结果类型
  4. API 密码
  5. 简写
  6. 福利
  7. 测试
  8. 实例
  9. 请求网络
  10. 反应组件中的处理出错
  11. 链路操作
  12. 概览
  13. 返回值
  14. 处理错误
  15. 属性和方法
  16. 类型安全
  17. 同步支持
  18. 支持实例
  19. 6.2.1 国家
  20. 0.2.0 (中文(简体) )
  21. 0.14.0 (简体中文)
  22. 0.13.0 (韩语)
  23. 许可证

尝试

try-catch-cover

现代JavaScript & TypeScript项目的安全出错处理原始.

安装

使用 npm :

npm install @asleepace/try

使用 Yarn :

yarn add @asleepace/try

使用 Bun :

bun add @asleepace/try

快速启动

该套件的目标是提供简洁,类型安全并易于使用的工具来处理例外情况.

import { Try } from '@asleepace/try'

const [url, error] = Try.catch(() => new URL(userInput))

if (error) return console.warn(error.message)

const [response, networkError] = await Try.catch(() => fetch(url))
const [jsonData, parsingError] = await Try.catch(() => response!.json())

if (parsingError) return console.warn(parsingError.message)

return jsonData.userName

结果类型

这个 Try.catch(fn) 工具返回特殊结果类型 Res 这门课会延伸一个结果拖累。 这个 Res 类提供 处理成果的一些有用设施:

const result = await Try.catch(() => response.json())

// includes powerful type-guards
if (result.isErr()) return console.warn(result.error.message)

// and convenience methods
const json = result.unwrap()

// supports array destructuring
const [user, error] = await Try.catch(async () => {
  const profileUrl = new URL(json.user!.profile)
  return fetch(profileUrl).then((res) => res.json())
})

if (!error) {
  console.log(`Hello, ${user.name}!`)
} else {
  console.warn(error.message)
}

该词可以和数组解结构语法结合使用,如果只对值或出错感兴趣,该语法可以有所帮助.

const result = await Try.catch(() =>
  fetch('https://api.users.com/me')
    .then((res) => res.json())
    .then((usr) => usr as User)
)

console.log(result.value) // User  | undefined
console.log(result.error) // Error | undefined

// automatically narrows the type for you!

if (result.isOk()) {
  const user = result.value // User!
} else {
  const fail = result.error // Error!
}

// in some cases you may just want the value or to throw again:

const user = result.unwrap() // User | never

// or you may want the value or a fallback:

const user = result.unwrapOr(cachedUser) // User

API 密码

Try.catch<T>(fn: () => Promise<T>): Promise<[T, undefined] | [undefined, Error]>

执行一个函数并返回一个包含以下任一内容的 tuple:

  • [value, undefined] 如果函数成功执行
  • [undefined, error] 如果函数丢出错误

工作既具有同步功能,又具有同步功能,自动返回一个Aync操作的保证.

简写

此套件还导出一个名为 : 兽医 这代表 值/ 出错 并提供了一个更简洁的方式 与这个 api 互动.

// Add more examples of the VET shorthand
import { vet } from '@asleepace/try'

// Simple usage
const [value] = vet(() => JSON.parse(data))

// Only get the error
const [, error] = vet(() => JSON.parse(data))

// With TypeScript generics for better type inference
const [user] = vet<User>(() => getUserFromAPI())

福利

  • 无尝试/ 批次块: 清洁、可读代码,无嵌入式试验/捕获结构
  • 类型安全: 完整的类型Script支持和适当的类型推论
  • 一致模式:同步和同步代码的统一错误处理
  • 无依赖:轻而无依赖性
  • 异态: 在浏览器和节点环境中工作
  • 强大的结果: 安全、测试和多用途结果类别

测试

这个包包括一个全面的测试套件. 为了进行测试:

# Clone the repository
git clone https://github.com/asleepace/try.git
cd try

# Install dependencies
bun install

# Build project & generate types
bun run build

# Run tests
bun test

实例

请求网络

// handle synchronous operations which can throw with ease...
const encoded = Try.catch(() => JSON.stringify(userInput))

if (!encoded.ok) return encoded.error

const [response, networkError] = await Try.catch(() =>
  fetch('https://api.com/create', {
    method: 'POST',
    body: encoded.value,
  })
)

if (networkError) return networkError

const [user, jsonError] = await Try.catch(response.json)

if (jsonError) return jsonError

return user

反应组件中的处理出错

import React, { useEffect, useState } from 'react'
import { Try } from '@asleepace/try'

function UserProfile({ userId }) {
  const [user, setUser] = useState(null)
  const [loading, setLoading] = useState(true)
  const [error, setError] = useState(null)

  useEffect(() => {
    async function loadUser() {
      setLoading(true)

      const [userData, fetchError] = await Try.catch(async () => {
        const response = await fetch(`/api/users/${userId}`)
        if (!response.ok) throw new Error(`HTTP error ${response.status}`)
        return response.json()
      })

      setUser(userData)
      setError(fetchError)
      setLoading(false)
    }

    loadUser()
  }, [userId])

  if (loading) return <div>Loading...</div>
  if (error) return <div>Error: {error.message}</div>

  return (
    <div>
      <h1>{user.name}</h1>
      <p>{user.email}</p>
    </div>
  )
}

链路操作

import { Try } from '@asleepace/try'

async function processData(rawData): object | undefined {
  // Step 1: Parse the data
  const [parsed, parseError] = Try.catch(() => JSON.parse(rawData))
  if (parseError) return console.warn(parseError.message)

  // Step 2: Transform the data
  const [transformed, transformError] = Try.catch(() => {
    return parsed.items.map((item) => ({
      id: item.id,
      name: item.name.toUpperCase(),
      value: item.value * 2,
    }))
  })
  if (transformError) return console.warn(transformError.message)

  // Step 3: Save the data
  const saveResult = await Try.catch(async () => {
    const response = await fetch('/api/save', {
      body: JSON.stringify(transformed),
      method: 'POST',
    })
    return response.json()
  })

  if (saveResult.isErr()) return console.warn(saveResult.error)
  return saveResult.unwrap()
}

规格

概览

这个 Try.catch 函数提供了一种类型安全的方法来处理同步函数和同步函数中的错误,返回一个包含一个值或一个出错但从不同时包含的结果拖转.

返回值

  • Try.catch 总是返回一个或一个 ResultOk<T> 或者说 ResultError 类型,该类型延伸出tuple类型 [T, undefined] 或者说 [undefined, Error] 页:1.
  • 返回对象保证有确切的两个元素,或者索引0,或者索引1没有定义.
  • 如果函数成功完成,索引 0 将包含返回值,索引 1 将未定义 .
  • 如果函数丢出错误,索引 0 将被取消定义,索引 1 将包含错误.

处理错误

  • 如果抛出一个非错误值( 如字符串、 数字或对象), 将自动转换为内置实例 Error 课.
  • 抛出尚未出错的值将首先被强制用字符串,然后用于构建新的 Error 举个例子.
  • 如果函数返回一个 Error 对象作为其值(不是抛出),它将被当作成功结果与 Error 作为索引 0 的值,而不是错误大小写.

属性和方法

返回结果对象包括若干便利属性和方法:

  • .value: 返回索引 0 的值(成功值),如果出现错误,则返回未定义的值.
  • .error:在索引1中返回错误,如果操作成功,则返回未定义错误.
  • .ok: 一个布尔属性,即 true 何时 .error === undefined 财务报告和审定财务报表 false 否则.
  • .unwrap(): 如果存在, 返回该值, 如果没有值, 则丢弃已捕获错误 .
  • .unwrapOr(fallback): 如果数值存在, 返回该值, 如果没有值, 则返回该值.
  • .toString(): 返回结果的字符串表示,显示成功值或错误消息.

类型安全

  • 返回的结果类型在类型保护上正确缩小:
    • 检查时 if (result.ok),类型脚本将缩小类型到 ResultOk<T>。 。 。 .
    • 检查时 if (!result.ok),类型脚本将缩小类型到 ResultError。 。 。 .
  • 单位 ResultOk<T> 环境, result.value 输入为 T 财务报告和审定财务报表 result.error 输入为 undefined。 。 。 .
  • 单位 ResultError 环境, result.value 输入为 undefined 财务报告和审定财务报表 result.error 输入为 Error。 。 。 .

同步支持

  • Try.catch 支持同步和同步函数.
  • 当通过一个返回承诺的函数时, Try.catch 返回一个解答结果的 TUPLE的承诺.
  • 拒绝的许诺被俘获并转换为出错结果,遵循与抛出错误相同的规则.

支持实例

  • 返回结果对象为 TryResultClass,启用 instanceof 检查.
  • 这样可以更容易地进行类型检查,并与现有的代码模式相融合.

更改日志

6.2.1 国家

  • 添加 Res.ok(value) 财务报告和审定财务报表 Res.err(error) 初始化器
  • 添加 isOk() 财务报告和审定财务报表 isErr() 结果类型警卫
  • 将所有代码移动到 src/index.ts
  • 删除垃圾文件并缩小包大小
  • 删除内部 Try.#handler 方法
  • 简化 Try.catch 逻辑
  • 简化类型

0.2.0 (中文(简体) )

  • 添加 vet(fn) 手写
  • 添加方便方法
  • 更新 Result 类
  • 更新测试套件

0.14.0 (简体中文)

  • 更新 README.md
  • 更新 Try.catch 函数

0.13.0 (韩语)

  • 初步释放

许可证

麻省理工学院

版本与发布记录

@asleepace/try 共发布 7 个版本,首次发布于 2025/04/25;过去 12 个月发布了 0 个版本。

版本发布日期距今
0.2.1latest2025/04/271.5 年前
0.2.02025/04/261.5 年前
0.1.42025/04/251.5 年前
0.1.32025/04/251.5 年前
0.1.22025/04/251.5 年前
0.1.12025/04/251.5 年前

关于 @asleepace/try 的常见问题

@asleepace/try 是什么?

用于例外处理和错误的脚本工具.

如何安装 @asleepace/try?

在项目目录运行 npm install @asleepace/try,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:typescript(^5)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@asleepace/try 支持 TypeScript 吗?

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

@asleepace/try 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@asleepace/try 可以商用吗?

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

@asleepace/try 的下载量有多少?

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

@asleepace/try 还在维护吗?

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