尝试
现代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 (韩语)
- 初步释放
许可证
麻省理工学院