TypeScript联合元组类型下控制流未触发类型收窄如何解决
TypeScript 联合元组类型窄化失效问题解决
问题原因
你定义的函数返回值是两个互斥元组的联合类型,如果你先将返回值解构为两个独立变量,TypeScript 不会跟踪两个变量之间的类型关联,所以判断redirect为undefined之后,无法自动推导出user一定存在。
解决方案
方案1:不解构,直接判断元组元素(最推荐)
直接对完整元组的索引做判断,TypeScript 可以正确识别联合类型的分支:
const result = await redirectIf(nextCookies, { notAuth: '/login' }) if (result[0]) { // 此时 result[0] 为 Redirect 类型,处理重定向逻辑即可 return redirect(result[0]) } // 走到此处时 TypeScript 会自动推导 result[1] 为 UserDto 类型 const user = result[1]
方案2:自定义类型守卫函数
如果希望逻辑更易读,可以写一个带类型谓词的守卫函数来做分支判断:
// 先获取返回值的类型定义 type RedirectIfResult = Awaited<ReturnType<typeof redirectIf>> function isAuthSuccess(result: RedirectIfResult): result is [undefined, UserDto] { return result[0] === undefined } // 使用示例 const result = await redirectIf(nextCookies, { notAuth: '/login' }) if (isAuthSuccess(result)) { const user = result[1] // 自动识别为 UserDto 类型 } else { const redirect = result[0] // 自动识别为 Redirect 类型 }
方案3:非空断言(不推荐,仅适合临时处理)
如果你确定逻辑判断没问题,也可以手动用!非空断言标记user一定存在,相当于主动告诉TypeScript忽略此处类型检查:
const [redirect, user] = await redirectIf(nextCookies, { notAuth: '/login' }) if (redirect) { return redirect(redirect) } const validUser = user! // 手动断言非空
内容的提问来源于stack exchange,提问作者zouabi
相关产品推荐
相关产品推荐

