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

Redux Toolkit结合TypeScript:如何为Reducer指定返回类型?

Redux Toolkit + TypeScript Reducer 返回类型问题解决

首先明确:Redux Toolkit(RTK)的Reducer默认集成了Immer库,允许你用直接修改state的"可变"写法,不需要手动返回新状态对象——这是RTK核心特性之一,也是你当前问题的关键误区。

你的代码问题分析

你当前手动返回新对象的写法,如果Slice State包含cards以外的其他字段,仅返回{ cards: ... }会导致返回对象与State类型不匹配,TypeScript报错,所以只能用any绕过。即使State只有cards字段,这种写法也不符合RTK最佳实践。

正确的两种写法

写法1:推荐(Immer可变写法,无需返回类型)

直接修改state,Immer会自动生成不可变的新状态,TypeScript自动推断类型,无需手动指定返回值:

// 假设你的Slice State类型定义
interface CardState {
  cards: Card[];
}

interface Card {
  id: string;
}

type DeleteCard = string;

// 正确的reducer写法
deleteCard: (state, { payload }: PayloadAction<DeleteCard>) => {
  // 直接修改state,Immer处理不可变更新
  state.cards = state.cards.filter(card => card.id !== payload);
}

写法2:手动返回完整状态(需指定正确返回类型)

如果坚持手动返回新状态,必须确保返回完整的State对象(包含所有字段),并指定返回类型为你的Slice State接口:

deleteCard: (state, { payload }: PayloadAction<DeleteCard>): CardState => {
  // 展开原state所有字段,避免丢失其他属性
  return {
    ...state,
    cards: [...state.cards.filter(card => card.id !== payload)]
  };
}

关键提醒

  • 不要用any绕过类型检查,这会失去TypeScript的类型安全优势
  • RTK的设计初衷就是用Immer的可变写法简化状态更新,优先使用写法1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:05:23