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
相关产品推荐
相关产品推荐

