它还有很多方法可以更方便地处理它们,以缓解 Go 问题 。最知名的是? 操作员 。
let greeting_file_result = File::open(“hello.txt”)?;这里的总结是,Go 和 Rust 总是知道哪里可能出现错误 。它们迫使你在它出现的地方(大部分)处理它 。没有隐藏的,没有猜测,没有令人惊讶的面孔破坏应用程序 。
而且这种方法更好 。一英里 。
好吧,是时候说实话了; 我撒了一点谎 。我们不能让 TypeScript 错误像 Go / Rust 那样工作 。这里的限制因素是语言本身; 它没有合适的工具来做到这一点 。
但我们能做的就是尽量让它相似 。并使其变得简单 。
从这个开始:
export type Safe<T> =| {success: true;data: T;}| {success: false;error: string;};这里没什么特别的,只是一个简单的泛型类型 。但这个小宝贝可以完全改变代码 。您可能会注意到,这里最大的区别是我们要么返回数据,要么返回错误 。听起来很熟悉?
另外……第二个谎言,我们确实需要一些尝试/捕获 。好消息是我们只需要大约两个,而不是 100,000 个 。
export function safe<T>(promise: Promise<T>, err?: string): Promise<Safe<T>>;export function safe<T>(func: () => T, err?: string): Safe<T>;export function safe<T>(promiseorFunc: Promise<T> | (() => T),err?: string,): Promise<Safe<T>> | Safe<T> {if (promiseOrFunc instanceof Promise) {return safeAsync(promiseOrFunc, err);}return safeSync(promiseOrFunc, err);}async function safeAsync<T>(promise: Promise<T>,err?: string): Promise<Safe<T>> {try {const data = https://www.isolves.com/it/cxkf/yy/js/2023-09-07/await promise;return { data, success: true };} catch (e) {console.error(e);if (err !== undefined) {return { success: false, error: err };}if (e instanceof Error) {return { success: false, error: e.message };}return { success: false, error: "Something went wrong" };}}function safeSync“哇哦,真是个天才 。他为 try/catch 创建了一个包装器 。” 是的你是对的; 这只是一个包装器,以我们的 Safe 类型作为返回类型 。但有时您所需要的只是简单的事情 。让我们将它们与上面的示例结合起来 。
旧的(16行):
try {const request = { name: “test”, value: 2n };const body = JSON.stringify(request);const response = await fetch("https://example.com", {method: “POST”,body,});if (!response.ok) {// handle.NETwork errorreturn;}// handle response} catch (e) {// handle errorreturn;}新的(20行):
const request = { name: “test”, value: 2n };const body = safe(() => JSON.stringify(request),“Failed to serialize request”,);if (!body.success) {// handle error (body.error)return;}const response = await safe(fetch("https://example.com", {method: “POST”,body: body.data,}),);if (!response.success) {// handle error (response.error)return;}if (!response.data.ok) {// handle network errorreturn;}// handle response (body.data)所以,是的,我们的新解决方案更长,但性能更好,原因如下:
- 没有try/catch 。
- 我们处理发生的每个错误 。
- 我们可以为特定函数指定错误消息 。
- 我们有一个很好的从上到下的逻辑,所有错误都在顶部,然后只有响应在底部 。
if (!body.success) {// handle error (body.error)return;}问题是……我们不能 。是的,我们必须进行这项检查 。如果不这样做,body.data 将不存在 。LSP 将通过抛出“‘Safe<string>’类型上不存在属性‘data’”错误来提醒我们 。这一切都归功于我们创建的简单 Safe 类型 。它也适用于错误消息 。在检查 !body.success 之前,我们无法访问 body.error 。现在我们应该欣赏 TypeScript 以及它如何改变 JavaScript 世界 。
以下内容也是如此:
if (!response.success) {// handle error (response.error)return;}我们不能删除 !response.success 检查,因为否则,response.data 将不存在 。当然,我们的解决方案并非没有问题 。最重要的一点是,您必须记住使用我们的安全包装器来包装可能引发错误的 Promise/函数 。这种“我们需要知道”是我们无法克服的语言限制 。
推荐阅读
- 彻底理解什么是同步和异步!
- K8s 多集群实践思考和探索
- C++进阶:纯虚函数和抽象类的奥秘
- 梁靖琪和儿子开心为老公庆生晒温馨合影
- 结婚7年未育,47岁陈紫函聊晚年生活,戴向宇:老了去寺庙当和尚
- 钓鲫鱼和鲤鱼混养塘的5个要领,鲫鲤都爆护
- 碧玉盆栽养殖方法和技术 碧玉盆栽养殖方法
- 梦见死人和棺材是什么兆头 梦见死人和棺材什么预兆
- 红鲫鱼的养殖方法 红鲫鱼的养殖方法和注意事项视频
- 扫尘的风俗和意义 扫尘的风俗和意义作文
