使用Redux Toolkit创建Redux Store时,TypeScript提示「Object is of type 'unknown'」的问题求助
解决Redux Toolkit + TypeScript中useSelector的state类型问题
你遇到的问题本质是TypeScript无法推断出Redux Store的整体State类型,所以它把state默认标记为unknown,而你直接指定Object或Array类型并不符合实际的State结构,自然会报错。下面是具体的修复步骤:
第一步:为Redux Store定义类型(修改你的redux文件)
首先把你的redux.js重命名为redux.ts(因为我们要写TypeScript代码),然后添加必要的类型定义:
import { configureStore, createSlice, TypedUseSelectorHook, useSelector } from "@reduxjs/toolkit"; // 1. 定义Test slice中每个元素的类型 interface TestItem { type: string; data: any; // 这里可以替换成你实际的payload类型,比如`User`、`LoginInfo`等更具体的类型 } // 2. 定义Test slice的State类型(是TestItem的数组) type TestState = TestItem[]; const testSlice = createSlice({ name: "test", // 给initialState标注类型,让TS明确它的结构 initialState: [] as TestState, reducers: { callApi: (state, action) => { const getData = { type: "test/getData", data: action.payload }; state.push(getData); } } }); export const store = configureStore({ reducer: { test: testSlice.reducer } }) // 3. 导出整个Store的RootState类型(从store的getState方法自动推断) export type RootState = ReturnType<typeof store.getState>; // 4. 可选:创建一个自定义的useSelector钩子,避免每次都手动标注类型 export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;
第二步:在组件中使用正确的类型
方式一:直接使用RootState标注state类型
在Login.tsx中导入RootState,并给useSelector的参数标注类型:
import React from 'react'; import { useSelector } from 'react-redux'; import { RootState } from './redux'; const Login = () => { // 现在TS能正确推断state.test是TestState类型(TestItem数组) const test = useSelector((state: RootState) => state.test); // 后续逻辑... return <div>Login Component</div>; }; export default Login;
方式二:使用自定义的useAppSelector钩子(更简洁)
如果你不想每次都写state: RootState,可以用我们刚才在redux.ts中定义的useAppSelector:
import React from 'react'; import { useAppSelector } from './redux'; const Login = () => { // 自动推断state的类型,无需手动标注 const test = useAppSelector(state => state.test); // 后续逻辑... return <div>Login Component</div>; }; export default Login;
为什么之前的尝试会失败?
- 当你指定
state: Object时,TypeScript只知道state是一个普通对象,但不知道它包含test这个属性,所以会报错“test不属于Object类型”。 - 当你指定
Array类型时,整个Redux Store的State其实是一个包含多个slice的对象(你的例子里是{ test: TestState }),而不是一个数组,所以这个类型也不匹配。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

