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

如何用TypeScript泛型函数从联合类型返回指定类型?

用TypeScript泛型函数过滤API返回的BadResult,仅返回成功结果

我的API返回结果遵循固定模式:总是具体成功类型与BadResult的联合类型,示例如下:

// 定义成功结果类型
type CreatedPersonResult = { id: string; name: string };
type CreatedRoleResult = { roleId: number; roleName: string };

// 定义错误结果类型
type BadResult = { errorCode: number; message: string };

// API返回的联合类型
type Result1 = CreatedPersonResult | BadResult;
type Result2 = CreatedRoleResult | BadResult;

我需要一个泛型包装函数,传入这类联合类型结果后,只返回纯成功类型;如果输入是BadResult则直接抛出错误。可以借助TypeScript的Exclude工具类型实现,完整代码如下:

// 类型守卫:运行时判断是否为BadResult,同时给TS提供编译时类型信息
function isBadResult(result: unknown): result is BadResult {
  return typeof result === 'object' && result !== null 
    && 'errorCode' in result && 'message' in result;
}

// 泛型处理函数
const resolveActualType = <T>(result: T): Exclude<T, BadResult> => {    
  if (isBadResult(result)) {
    throw new Error(`API请求失败:${result.message}(错误码:${result.errorCode})`);
  }
  
  // 类型断言告知TS:此时result已排除BadResult类型
  return result as Exclude<T, BadResult>;
}

关键说明

  • 类型守卫isBadResult:TypeScript无法自动在运行时识别联合类型分支,这个函数既做运行时判断,也让TS在编译时缩小类型范围。
  • Exclude<T, BadResult>:从泛型参数T中剔除BadResult类型,确保函数返回值为纯成功结果类型。
  • 错误抛出:检测到BadResult时抛出带详细信息的错误,方便调用方捕获处理。

使用示例

// 模拟成功返回
const successPerson: Result1 = { id: '1001', name: '张三' };
// 模拟错误返回
const failPerson: Result1 = { errorCode: 400, message: '参数格式错误' };

// 处理成功结果
try {
  const person = resolveActualType(successPerson);
  // person的类型自动推导为CreatedPersonResult
  console.log('创建用户成功:', person.name);
} catch (err) {
  console.error(err);
}

// 处理错误结果
try {
  resolveActualType(failPerson);
} catch (err) {
  console.error(err); // 输出:API请求失败:参数格式错误(错误码:400)
}

内容的提问来源于stack exchange,提问作者eVolve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:40:31