reactjs - Typescript และ Redux connect
ฉันกำลังพยายามเชื่อมต่อ Redux กับคอมโพเนนต์โดยใช้ Typescript และก็เจอข้อผิดพลาดเดิมซ้ำไปซ้ำมา
อาร์กิวเมนต์ประเภท 'typeof BaseLayoutUnconnected' ไม่สามารถกำหนดค่าให้กับพารามิเตอร์ประเภท 'Component
' ได้ คุณสมบัติ 'setState' หายไปในประเภท 'typeof BaseLayoutUnconnected'
import * as React from 'react';
import { IBaseLayoutProps, IBaseLayoutState } from './base-layout.types';
import { ChatContainer } from '../../components';
import { connect, DispatchProp } from 'react-redux';
import { bindActionCreators, Dispatch } from 'redux';
import { RouteComponentProps } from 'react-router';
import { ChatActions } from 'app/actions';
import { RootState } from 'app/reducers';
import { omit } from 'app/utils';
export const mapStateToProps = (state: RootState, ownProps) => {
return {
chatItems: state.chatItems
};
};
export const mapDispatchToProps = (dispatch: Dispatch) => ({
actions: bindActionCreators(omit(ChatActions, 'Type'), dispatch)
});
export class BaseLayoutUnconnected extends React.Component<IBaseLayoutProps, IBaseLayoutState> {
constructor(props) {
super(props);
this.state = {};
}
render() {
const { actions, chatItems } = this.props;
return <ChatContainer actions={actions} chatItems={chatItems} />;
}
}
export const BaseLayout = connect(
mapStateToProps,
mapDispatchToProps
)(BaseLayoutUnconnected);
นี่กำลังถูกเรียกในไฟล์ app.tsx ของฉันผ่าน
<Route exact={true} path="/" component={BaseLayout} />
นี่คือ props และ state
export interface IBaseLayoutProps {
chatItems: RootState.ChatState;
actions: ChatActions;
}
export interface IBaseLayoutState {}
ChatActions ดูเหมือน
import { createAction } from 'redux-actions';
import { ChatItemModel } from 'app/models';
export namespace ChatActions {
export enum Type {
ADD_CHAT_ITEM = 'ADD_CHAT_ITEM'
}
export const addChatItem = createAction<PartialPick<ChatItemModel, 'text'>>(Type.ADD_CHAT_ITEM);
}
export type ChatActions = Omit<typeof ChatActions, 'Type'>;
คำตอบ #1
นั่นก็เป็นปัญหาที่ฉันเคยเจอเมื่อฉันเริ่มใช้ Redux และ TypeScript มีวิธีแก้ที่ซับซ้อนอยู่ วิธี connect รับค่าพารามิเตอร์แบบ generics หลายตัว ฉันจะพยายามอธิบายมันด้วยตัวอย่างของคุณ
ก่อนอื่นคุณต้องแยกคุณสมบัติของ BaseLayoutUnconnected ของคุณออกมาก่อน
export interface IBaseLayoutStateProps {
chatItems: RootState.ChatState;
}
export interface IBaseLayoutDispatchProps {
actions: ChatActions;
}
export interface IBaseLayoutOwnProps {
// put properties here you want to make available from the connected component
}
export type IBaseLayoutProps = IBaseLayoutOwnProps & IBaseLayoutDispatchProps & IBaseLayoutStateProps
export interface IBaseLayoutState {}
จากนั้นคุณต้องกรอกประเภททั่วไปของฟังก์ชันรีดักซ์ต่างๆ
const mapStateToProps: MapStateToProps<IBaseLayoutStateProps, {}, RootState> = (state: RootState): IBaseLayoutStateProps => ({
chatItems: state.chatItems
})
export const mapDispatchToProps: MapDispatchToPropsFunction<IBaseLayoutDispatchProps, IBaseLayoutOwnProps> = (dispatch: Dispatch, ownProps: IBaseLayoutDispatchProps): IBaseLayoutDispatchProps => ({
actions: bindActionCreators(omit(ChatActions, 'Type'), dispatch)
});
export default connect<IBaseLayoutStateProps , IBaseLayoutDispatchProps, IBaseLayoutOwnProps , RootState>(
mapStateToProps,
mapDispatchToProps
)(BaseLayoutUnconnected as any)
แหล่งข้อมูลที่ดี ซึ่งคุณสามารถหาสิ่งที่ฉันเขียนทั้งหมดและอื่นๆ ได้คือที่เก็บนี้
