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

Redux Toolkit createSlice设置初始状态时出现TypeScript报错

报错原因

这个报错是代码写法+类型定义的多重问题共同导致的:

  • initialState传参写法错误
    你在createSlice配置里写的是initialState:{initialState},这是ES6对象简写语法,等价于initialState: { initialState: 你定义的initialState变量 },相当于给slice套了一层多余的外层对象。此时slice识别到的state结构是{ initialState: TUser },state本身根本没有users这个顶层属性,你直接访问state.users自然会报不存在的错误。
  • 类型定义不符合实际state结构,存在隐藏类型问题
    你定义的TUser = IUser | IUsers是联合类型,TS对联合类型的属性访问做了限制:只能访问所有联合成员共有的属性。你的IUser只有user字段,IUsers只有users字段,两个接口没有公共属性,就算你修正了initialState的传参,直接访问state.users还是会报类型错误——因为TS无法确定当前state是IUser类型还是IUsers类型。
    另外你实际写的initialState同时包含user和users两个字段,本身就不符合你定义的联合类型约束:联合类型要求值要么符合IUser结构,要么符合IUsers结构,不允许同时带两个字段。
  • reducer赋值逻辑存在隐含类型错误
    就算前面的问题都修了,你写的state.users=action.payload也不符合类型要求:action.payload是IUsers类型,结构是{ users: IUser[] },而state.users的类型是IUser[],直接把整个payload赋值过去类型不匹配。

修正方案
  • 调整类型定义,匹配你实际需要的state结构,不要用不符合场景的联合类型:
    // redux-models.ts
    export interface IUser{
        user:{}
    }
    export interface IUsers{
        users:IUser[]
    }
    // 直接定义state实际结构:同时包含单个user和user列表
    export interface IUserState {
      user: {};
      users: IUser[];
    }
    
  • 修正slice的initialState传参,去掉多余的对象包裹,同时修正reducer里的赋值逻辑:
    // todoSlice.ts
    import { createSlice,PayloadAction } from "@reduxjs/toolkit";
    import { IUserState, IUsers } from "./redux-models";
    
    
    const initialState: IUserState = {
        user:{},
        users:[]
    }
    const slice=createSlice({
        name:"slice",
        // 直接传入initialState变量,不要包裹成{initialState}
        initialState,
        reducers:{
            setUsers(state,action:PayloadAction<IUsers>){
                // 取payload里的users字段赋值,匹配IUser[]类型
                state.users = action.payload.users;
            }
        }
    })
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:45:50