我无法输入mapStateToProps的“状态”参数
如果我仅更改state : any
而不是state: AppState
,它将起作用,并且没有错误。
但是我想为我的state参数输入正确的字符。
现在,我在connect()的mapStateToProps参数上遇到此错误
没有重载匹配此调用。 最后一次重载给出了以下错误。 类型'(state:{测验:IQuizInitialState;})=> StateProps'的参数不可分配给'MapStateToPropsParam'类型的参数。 无法将类型'(state:{测验:IQuizInitialState;})=> StateProps'分配为'MapStateToPropsFactory'。 参数“状态”和“初始状态”不兼容。 类型“ {}”中缺少属性“测验”,但类型“ {{测验:IQuizInitialState; }'。ts(2769)
interface OwnProps {
}
interface StateProps {
}
interface DispatchProps {
}
type Props = OwnProps & StateProps & DispatchProps;
export class App extends Component<Props> {
render() {
return (
<div>Hey</div>
);
}
}
const mapStateToProps = (state: AppState): StateProps => ({
})
const mapDispatchToProps = (dispatch: ThunkDispatch<{}, {}, AnyAction>): DispatchProps => {
return {
}
}
// The args 'mapStateToProps' generate the error
export default connect<StateProps,DispatchProps,OwnProps>(mapStateToProps, mapDispatchToProps)(App)
这是我的rootReducer:
import { combineReducers } from 'redux';
import { QuizReducer } from './quiz';
const rootReducer = combineReducers({
quiz: QuizReducer
});
export type AppState = ReturnType<typeof rootReducer>
export default rootReducer;
单个减速器为:
import { TYPES } from '../actions/action-types';
import { IQuizListItem, Action } from '../models/index';
import { AnyAction } from 'redux';
export interface IQuizInitialState {
quizListItem: IQuizListItem[]
}
const quizInitialState: IQuizInitialState = {
quizListItem: []
}
export const QuizReducer = (state = quizInitialState, action: AnyAction): IQuizInitialState => {
switch (action.type) {
case TYPES.getQuizListItems:
return {
...state,
quizListItem: (action as Action<IQuizListItem[]>).payload
}
default:
return state
}
}
谢谢各位!
答案 0 :(得分:9)
您的州类型与整个州使用的类型相同。因为mapStateToProps将整个状态传递给选择器。对于您的情况,我相信这将是正确的类型IQuizInitialState
。
const mapStateToProps = (state: IQuizInitialState): StateProps => ({
})
编辑
在您的评论中,您提到 IQuizInitialState 并不是您的整个应用程序状态。那么那不是您需要的那个。您需要整个应用程序状态的类型。要实现此目的,您可以为每个单个化简器类型(即您的 IQuizInitialState )创建一个接口,而将其他化简器创建一个接口。
由于我没有您的代码库,但考虑一下,
combineReducers({potato: quizReducer, tomato: otherReduzer})
您需要输入文字
interface IApplicationState {
potato: IQuizInitialState;
tomato: IOTherInterfaceYouDefinedForThisReducer;
}
您的CombineReducers可能看起来像:
combineReducers<IApplicationState>({
potato: quizReducer,
tomato: otherReduzer
});
希望您能明白。
编辑2 阅读您的最后一条评论后,我注意到您正在请求带有两个参数的mapStateToProps。而您只是定义一个。然后,您的连接泛型似乎是错误的。您应该考虑以下几点:
connect<StateProps, DispatchProps, Props, IApplicationState>
其中: