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

TypeScript编写reducer.ts报name不存在于类型never错误如何解决

报错原因

你没有给state显式定义类型,TypeScript默认会把initialState里的空数组items、cart推断为never[]类型,never类型不存在任何属性,所以访问item.name时就会抛出2339错误。

解决方法

1. 定义类型接口

先定义购物车条目的基础类型,再定义整个state的结构接口:

// 按需补充字段即可,和你实际业务里的商品字段保持一致
interface CartItem {
  name: string;
  // 其他字段示例:id: number; price: number; count: number;
}

// State结构和你的initialState完全对应
interface State {
  items: CartItem[];
  cart: CartItem[];
}

2. 给initialState标注类型

给你定义的initialState加上显式的State类型标注:

import { ActionsUnion, ActionTypes } from './actions';

// 把上面定义的两个接口放在这里,或者单独抽离到type.ts文件引入
interface CartItem {
  name: string;
}
interface State {
  items: CartItem[];
  cart: CartItem[];
}

export const initialState: State = {
  items: [],
  cart: []
};

3. 给reducer函数补充类型标注

确保你的reducer函数的第一个参数state标注为State类型:

// reducer函数定义示例
export function reducer(state: State = initialState, action: ActionsUnion) {
  switch (action.type) {
    // 你的其他case逻辑
    case ActionTypes.Remove:
      // 这里可以直接用filter的返回值,不需要额外展开数组,filter本身就会返回新数组
      return {
        ...state,
        cart: state.cart.filter(item => item.name !== action.payload.name)
      };
    default:
      return state;
  }
}

可选优化:补全Action的payload类型

如果你的ActionsUnion还没有定义Remove动作的payload类型,可以在actions.ts里补充定义,避免访问action.payload.name时也出现类型报错:

// actions.ts示例代码
export enum ActionTypes {
  Remove = '[Cart] Remove Item'
  // 其他动作类型
}

// 定义删除动作的创建函数,显式指定payload为CartItem类型
export const removeCartItem = (item: CartItem) => ({
  type: ActionTypes.Remove,
  payload: item
})

// 把所有动作创建函数的返回类型合并成ActionsUnion
export type ActionsUnion = ReturnType<typeof removeCartItem>
// 如果有其他动作,就用 | 拼接:ReturnType<typeof addCartItem> | ReturnType<typeof clearCart>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:36:07