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

