我正在尝试使用Typescript在Redux中的状态数组中执行.map
函数,问题是它正在抛出错误
[ts]'never'
类型中不存在属性'id'
在landing.id
if语句中,因为它是一个对象数组,代码对我来说很有意义但似乎我错过了那里
export default function landingReducer (state = [], action) {
switch(action.type) {
case ActionTypes.ADD_LANDING:
return [...state, action.landing]
case ActionTypes.EDIT_LANDING:
return state.map(landing => {
if (action.landing.id == landing.id) {
return landing;
}
})
提前致谢!
答案 0 :(得分:2)
可能是由于state
和/或action
参数缺少类型。尝试使用适用于TypeScript 2.4+的代码,受此article启发:
interface Landing {
id: any;
}
enum ActionTypes {
ADD_LANDING = "ADD_LANDING",
EDIT_LANDING = "EDIT_LANDING",
OTHER_ACTION = "__any_other_action_type__"
}
interface AddLandingAction {
type: ActionTypes.ADD_LANDING;
landing: Landing;
}
interface EditLandingAction {
type: ActionTypes.EDIT_LANDING;
landing: Landing;
}
type LandingAction =
| AddLandingAction
| EditLandingAction;
function landingReducer(state: Landing[], action: LandingAction) {
switch (action.type) {
case ActionTypes.ADD_LANDING:
return [...state, action.landing]
case ActionTypes.EDIT_LANDING:
return state.map(landing => {
if (action.landing.id === landing.id) {
return landing;
}
});
}
}
答案 1 :(得分:0)
您的代码缺少括号和其他必要的导入,这使得其他人很难快速reproduce and diagnose。
话虽这么说,TypeScript将state
参数推断为空数组文字[]
的类型,它被认为是never[]
,这意味着它将始终为空。因此map
函数不起作用,因为landing
被推断为不可能的值(没有never
类型的有效值。)
如果你想修复它,你应该告诉TypeScript可能是哪种类型的数组state
。快速解决方法是使其成为any
:
... function landingReducer (state: any[] = [], action) ...
理想情况下,您应该为参数添加更多特定类型,以便TypeScript可以帮助您捕获错误(您如何知道action
具有type
属性?)。
希望有所帮助;祝你好运!