React+TS使用Context报singIn is not a function错误如何修复
报错原因
运行时抛出singIn is not a function,本质是从鉴权Context中解构得到的singIn不是可执行函数,结合给出的代码,触发原因如下:
- 使用Context的组件未被AuthProvider包裹
你创建Context时传入的初始值是{} as AuthContextType,这只是TypeScript编译阶段的强制类型断言,仅用于跳过类型检查,不会在运行时给空对象补充singIn/singOut/user属性。如果调用useAuth()的登录组件没有放在<AuthProvider>的子组件树范围内,拿到的Context值就是这个空对象,解构出的singIn为undefined,调用时就会抛出类型错误。
正是因为用了as强转跳过了类型校验,IDE不会提示初始值缺失属性的问题,错误只会在运行时暴露。
如果确认已经正确包裹了Provider,检查自定义useAuthhook的实现,确保它内部通过useContext(AuthContext)读取上下文,返回值没有写错属性名。 - 命名拼写不规范(非当前报错核心诱因)
登录、登出的标准命名为signIn/signOut(词根为sign,表签名、登录),你全程写成了singIn/singOut(词根为sing,表唱歌),如果后续其他地方引用时用了正确拼写,会因为属性名不匹配拿到undefined触发同类错误。从当前贴出的代码看,上下文定义、传值、解构的拼写是统一的,不是本次报错的直接原因。
修复方案
- 调整组件层级,确保所有用到鉴权Context的组件都被
AuthProvider包裹
错误写法(登录页在Provider作用域外,拿不到有效Context值):
正确写法(需要鉴权的路由全部放在Provider子树内):<BrowserRouter> <Route path="/login" element={<LoginPage />} /> <AuthProvider> <Route path="/" element={<Home />} /> </AuthProvider> </BrowserRouter><BrowserRouter> <AuthProvider> <Route path="/login" element={<LoginPage />} /> <Route path="/" element={<Home />} /> </AuthProvider> </BrowserRouter> - 优化Context初始值写法,移除不安全的类型强转
不要用as把空对象强制断言为Context类型,传入符合类型定义的初始值,一旦组件脱离Provider范围调用方法,会直接抛出明确的提示错误,同时IDE也能在编译阶段提前发现问题:// 替换原有createContext代码 export const AuthContext = createContext<AuthContextType>({ user: undefined, singIn: async () => { throw new Error("singIn方法必须在AuthProvider范围内调用"); }, singOut: async () => { throw new Error("singOut方法必须在AuthProvider范围内调用"); } }); - (可选规范优化)统一修正拼写,把代码中所有
singIn/singOut替换为标准命名signIn/signOut,避免后续协作时因拼写差异触发同类问题。
内容的提问来源于stack exchange,提问作者Gabriel Donada
相关产品推荐
相关产品推荐

