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

React中如何让OAuth登录函数返回never类型,标识后续代码不执行?

问题描述

我有一个启动OAuth流程的函数(例如重定向到Google OAuth登录页面):

async function signIn() {
  // start Oauth flow
}

我希望在useEffect中按如下方式使用该函数:

...
useEffect(() => {
  async function someAsyncFunc() {
    randomFunc1();
    await signIn();
    randomFunc2(); // 永远不会执行,因为signIn会触发页面重定向
  }

  someAsyncFunc();
}, []);
...

由于signIn()执行后会触发页面重定向,randomFunc2()永远不会被执行。我想通过TypeScript的类型系统告知其他开发者:在signIn()之后调用函数毫无意义,这些代码永远不会执行。我了解TypeScript的never类型,但不确定是否适用于异步场景,比如Next.js的redirect函数就返回never类型,请问有什么可行方案?

解决方案

直接将signIn的返回类型声明为Promise<never>即可,这是异步场景下模拟"永不返回"行为的正确方式,和Next.js的redirect函数原理一致。

1. 修改signIn函数的类型声明

async function signIn(): Promise<never> {
  // 执行OAuth重定向逻辑
  window.location.href = "https://accounts.google.com/oauth2/v2/auth?..."
  
  // 由于页面会立即重定向,这里添加兜底逻辑确保函数不会正常返回
  while (true) {}
  // 也可以用抛出错误替代:throw new Error("Redirecting to OAuth provider")
}

2. 编译时自动提示不可达代码

当其他开发者在await signIn()之后编写代码时,TypeScript会直接抛出编译错误:"Unreachable code detected",直观告知后续代码永远不会被执行,从类型层面避免无效代码的编写。

原理说明

  • never类型代表"永远不会产生返回值"的类型,对于异步函数,返回Promise<never>表示这个Promise永远不会被resolve,也不会正常完成。
  • 页面重定向会直接销毁当前页面的JavaScript执行上下文,signIn()之后的代码确实无法运行,用Promise<never>让类型系统和运行时行为完全匹配,精准传递函数的行为意图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:00:12