You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化TypeScript/JavaScript中判空返回后解构数组的重复代码?

如何简化TypeScript/JavaScript中判空返回后解构数组的重复代码?

这种重复的「调用异步函数→判空返回→解构数组」确实挺磨人的,我之前处理类似场景时,试过几个实用的方案,分享给你:

方案一:封装辅助函数+try/catch统一处理

这是我最常用的方式,把判空逻辑抽成一个通用辅助函数,遇到空结果就抛出自定义错误,然后在主函数里用try/catch统一捕获并退出,主流程会清爽很多:

首先定义一个自定义错误和辅助函数:

// 自定义错误,用来标记空结果的情况
class EmptyResultError extends Error {}

// 辅助函数:调用目标异步函数,结果为空则抛出错误,否则返回结果
async function getOrThrow(fn, ...args) {
  const result = await fn(...args);
  if (result == null) {
    throw new EmptyResultError();
  }
  return result;
}

然后改造你的主函数:

async function myLongFunction() {
  try {
    // 直接解构,不用再写判空逻辑
    const [actual, data, here] = await getOrThrow(whatever);
    
    // 带参数的调用也一样
    const [other, thing] = await getOrThrow(
      whatever, 
      actual.something, 
      data.something.else + here.length
    );
    
    const [final, finalData] = await getOrThrow(
      whatever, 
      other.count, 
      thing.size
    );
    
    return `${final.name} ${finalData.size}`;
  } catch (e) {
    // 只捕获我们自定义的空结果错误,直接退出函数
    if (e instanceof EmptyResultError) {
      return;
    }
    // 其他错误正常抛出,不吞掉异常
    throw e;
  }
}

如果是TypeScript,还可以给辅助函数加上类型注解,让类型推断更准确:

class EmptyResultError extends Error {}

async function getOrThrow<T extends any[]>(
  fn: (...args: any[]) => Promise<T | null | undefined>,
  ...args: any[]
): Promise<T> {
  const result = await fn(...args);
  if (result == null) {
    throw new EmptyResultError();
  }
  return result;
}

方案二:辅助函数返回标记值,简化判空

如果你不想用try/catch,也可以让辅助函数在结果为空时返回一个特殊标记,然后用简短的判断退出:

async function getOrNull(fn, ...args) {
  const result = await fn(...args);
  return result == null ? null : result;
}

async function myLongFunction() {
  const result = await getOrNull(whatever);
  if (!result) return;
  const [actual, data, here] = result;

  const someOtherResult = await getOrNull(
    whatever, 
    actual.something, 
    data.something.else + here.length
  );
  if (!someOtherResult) return;
  const [other, thing] = someOtherResult;

  // 后续逻辑同理...
}

这个方案比原始写法少了一半的重复代码(不用每次写if (result == null) { return; },改成if (!result) return;),虽然还是有判断,但简洁了不少。

不推荐的方案:IIFE强制退出

你提到的用IIFE尝试跳出外层函数的写法,确实没法实现——因为IIFE是独立的函数作用域,它的return只能退出自身,影响不了外层的函数。而且这种写法可读性极差,不建议在业务代码里用。

备注:内容来源于stack exchange,提问作者zaitsman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:19:35