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

React+TypeScript基于角色授权路由:useAuth调用setAuth类型错误求助

解决React + TypeScript中useAuth的类型错误

问题原因

你遇到的类型错误是因为createContext初始值设为{}时,TypeScript会自动推断其类型为空对象,导致useContext返回的对象类型不包含setAuth属性,解构时自然报错。

解决方案步骤

1. 定义Auth相关类型

在AuthProvider.tsx中先明确状态和上下文的类型,让TypeScript能准确识别结构:

import { createContext, useState, ReactNode } from "react";

// 定义auth状态的类型,可根据你的业务需求扩展字段
type AuthState = {
  user?: {
    id: string;
    role: string;
  };
};

// 定义上下文的类型,包含状态和修改状态的方法
type AuthContextType = {
  auth: AuthState;
  setAuth: React.Dispatch<React.SetStateAction<AuthState>>;
};

2. 修正Context的创建与初始值

给createContext指定明确类型,避免TypeScript错误推断:

// 创建Context,初始值设为undefined,后续通过Provider注入正确值
const AuthContext = createContext<AuthContextType | undefined>(undefined);

3. 完善AuthProvider组件

给useState指定类型,确保状态符合定义的结构:

export const AuthProvider = ({ children }: { children: ReactNode }) => {
  // 指定useState的类型为AuthState
  const [auth, setAuth] = useState<AuthState>({});

  return (
    <AuthContext.Provider value={{ auth, setAuth }}>
      {children}
    </AuthContext.Provider>
  );
};

export default AuthContext;

4. 修改useAuth钩子添加类型安全检查

在useAuth.ts中添加判断,确保钩子仅在AuthProvider包裹的组件内使用,同时让TypeScript确认返回值类型:

import { useContext } from "react";
import AuthContext from "../context/AuthProvider";

const useAuth = () => {
  const context = useContext(AuthContext);
  if (!context) {
    throw new Error("useAuth must be used within an AuthProvider");
  }
  return context;
};

export default useAuth;

最终效果

修改完成后,在Login.tsx中使用const {setAuth} = useAuth();时,TypeScript会正确识别setAuth的类型,不会再抛出错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:43:32