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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:22:48