NextAuth调用signIn出现TS2532、TS2339类型错误如何解决
你已经定位到的类型问题是完全正确的,之所以会出现Property 'status' does not exist on type 'never'报错,本质是未给signIn指定对应泛型时,TS推导返回值固定为undefined,你加了非空判断后TS认为该分支逻辑永远不会触发,才会把result推导为never类型。
下面是更规范的处理方式:
- 取消
result的手动类型标注,依赖TS自动推导
手动标注返回值类型容易出现像之前把SignInResponse误写为SignInOptions的问题,只要给signIn传入'credentials'泛型,TS会自动推导出正确的返回值类型SignInResponse | undefined,无需额外标注:const result = await signIn<'credentials'>('credentials', { redirect: false, password: values.pass, email: values.email, }); - 简化类型判断逻辑,删除冗余的属性存在校验
因为泛型已经明确了result的非空类型就是SignInResponse,只要通过非空判断,就可以直接访问status、ok等属性,不需要额外写'status' in result的校验,也可以用可选链进一步简化代码:// 写法1:基础非空判断 if (result && result.status === 200 && result.ok) { // 成功逻辑 } // 写法2:可选链简化 if (result?.status === 200 && result.ok) { // 成功逻辑 } - 补充错误分支处理
现有逻辑只覆盖了登录成功的场景,建议补充登录失败的提示逻辑,避免用户无感知:if (result?.status === 200 && result.ok) { // 原有成功逻辑 } else { // 示例:弹出登录失败提示 alert('账号或密码错误,请重新输入') } - 替换
values的any类型
给表单参数定义明确的类型约束,避免后续字段名拼写错误无法被TS捕获:interface LoginFormValues { email: string; pass: string; } const doStuff = async (values: LoginFormValues) => { // 原有逻辑 }
你现有代码的疏漏主要是冗余的属性校验逻辑,以及缺少错误分支处理,核心的类型问题已经解决了。
内容的提问来源于stack exchange,提问作者Squiggs.
相关产品推荐
相关产品推荐

