如何用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
相关产品推荐
相关产品推荐

