JavaScript中与Rust的Result枚举最接近的实现方案是什么
JavaScript实现类Rust Result类型的三种方案
针对你需要同时返回「操作是否成功」和「布尔判断结果」的需求,JS生态中常用三种实现方案,均可以对齐Rust Result<bool, ()> 的语义:
方案1:标准化结果对象(无额外依赖,最常用)
直接返回固定结构的普通对象区分状态,是绝大多数JS项目的通用做法:
class OrderAutomation { // 原有私有方法:返回市场类型字符串 / false(获取失败) #getMarketType() { // 原有Selenium获取逻辑 } isB2B() { const marketType = this.#getMarketType(); // 读取失败,对应Rust Err(()) if (marketType === false) return { ok: false }; // 读取成功,对应Rust Ok(bool) return { ok: true, value: marketType === "B2B" }; } }
调用示例:
const automation = new OrderAutomation(); const b2bCheckRes = automation.isB2B(); if (!b2bCheckRes.ok) { // 处理市场类型获取失败的逻辑 } else if (b2bCheckRes.value) { // 是B2B订单的逻辑 } else { // 非B2B订单的逻辑 }
方案2:自定义Result类(更贴近Rust开发体验)
如果项目中有大量类似的返回场景,可以封装通用Result类,支持类似Rust的match语法:
class Result { constructor(isOk, value, error) { this.ok = isOk; this.value = isOk ? value : undefined; this.error = isOk ? undefined : error; } static Ok(value) { return new Result(true, value, null); } static Err(error = null) { return new Result(false, null, error); } match(handlers) { return this.ok ? handlers.Ok(this.value) : handlers.Err(this.error); } }
isB2B改造:
isB2B() { const marketType = this.#getMarketType(); return marketType === false ? Result.Err() : Result.Ok(marketType === "B2B"); }
调用示例:
automation.isB2B().match({ Ok: (isB2B) => { isB2B ? /* B2B逻辑 */ : /* 非B2B逻辑 */ }, Err: () => { /* 处理获取失败逻辑 */ } })
方案3:元组返回(类Go风格,简洁轻量)
偏好极简写法的话可以用[错误, 返回值]的元组结构:
isB2B() { const marketType = this.#getMarketType(); return marketType === false ? [new Error("无法获取市场类型"), null] : [null, marketType === "B2B"]; }
调用示例:
const [err, isB2B] = automation.isB2B(); if (err) { // 处理失败 } else if (isB2B) { // B2B逻辑 }
三种方案中方案1的兼容性最好,不需要额外封装就能直接使用,适合绝大多数场景;方案2适合对Rust写法熟悉、项目中有大量类似返回需求的场景。
内容的提问来源于stack exchange,提问作者Benjamin Peinhardt
相关产品推荐
相关产品推荐

