Я пытаюсь использовать этот шаблон для моего проекта реактивного машинописного текста. Я не могу настроить правильный тип действий. Это было легко с JavaScript. Но я новичок в TypeScript. Я хочу знать, почему мой код не работает. Также, пожалуйста, предложите лучший способ решить эту проблему.
Панель инструментов.tsx
interface IAction{
type: string,
payload: any,
}
interface IProps {
// dashboard: DashboardState;
dashboard: any;
// Actions
changeUserName: IAction;
}
interface IState {}
class Dashboard extends React.Component<IProps, IState> {
componentDidMount(){
console.info("____FOCUS____");
console.info(this.props);
this.props.changeUserName("NewName");
console.info("____FOCUS____");
// this.props.changeUserName('New Name');
}
render() {
return (
<>
<Helmet>
<title>Dashboard</title>
<meta name = "description" content = "Description of Dashboard" />
</Helmet>
<DashboardComponent username = {'somevalue'} />
{/* <Div>{t('')}</Div> */}
</>
);
}
}
const mapStateToProps = (state: any, ownProps: any) => ({
dashbaord: selectDashboard(state),
});
const mapDispatchToProps = (dispatch: any, ownProps: any) => ({
...bindActionCreators({
...actions,
}, dispatch),
});
const withConnect = connect(mapStateToProps, mapDispatchToProps);
const withReducer = injectReducer({key: sliceKey, reducer: dashboardReducer});
const withSaga = injectSaga({key: sliceKey, saga: dashboardSaga});
export default compose(
withReducer,
withConnect,
withSaga,
)(Dashboard);
Типы
Типы, которые я создаю, такие же, как и в документах.
/* --- STATE --- */
export interface DashboardState {
username: string;
}
export type ContainerState = DashboardState;
Кусочек
Это фрагмент, который я создаю. Это так, как описано в документах.
export const initialState: ContainerState = {
username: 'Initial Username',
};
const dashboardSlice = createSlice({
name: 'dashboard',
initialState,
reducers: {
changeUserName(state, action: PayloadAction<string>) {
state.username = action.payload;
},
},
});
export const { actions, reducer, name: sliceKey } = dashboardSlice;
На самом деле, мой код тоже недействителен. Он работает, но у меня нет действительных интерфейсов. Если вы можете, пожалуйста, скажите мне об этом.
Это выражение не вызывается. Тип 'IAction' не имеет позывных. TS2349 this.props.changeUserName("НовоеИмя");
У меня нет надлежащей реализации интерфейса для действий среза редуктора. Не могли бы вы привести пример этого?
Я предлагаю взглянуть на это руководство для редукторов.
Все делается так же, как в доке. Но у меня нет опыта работы с машинописным текстом. Я думаю, что не добавил правильные интерфейсы для действий.
Я добавляю фрагмент в вопросе.
Пожалуйста, просмотрите описание моего вопроса. Я добавил дополнительную информацию.
Проблема
Я неправильно создавал интерфейсы. Метод отправки компонентов на основе классов был таким же, как и раньше. Единственной проблемой были интерфейсы, которые теперь правильные.
Код решения
Панель инструментов.tsx
interface IProps {
initChangeUserName: Function;
changeUserName: Function;
}
interface IState {}
class Dashboard extends React.Component<IProps, IState> {
render() {
return (
<>
<Helmet>
<title>Dashboard</title>
<meta name = "description" content = "Description of Dashboard" />
</Helmet>
<DashboardComponent
username = {'somevalue'}
initChangeUserName = {this.props.initChangeUserName}
/>
</>
);
}
}
const mapStateToProps = (state: any, ownProps: any) => ({
dashboard: selectDashboard(state),
});
const mapDispatchToProps = (dispatch: any, ownProps: any) => ({
...bindActionCreators({ ...actions }, dispatch),
});
const withConnect = connect(mapStateToProps, mapDispatchToProps);
const withReducer = injectReducer({ key: sliceKey, reducer: dashboardReducer });
const withSaga = injectSaga({ key: sliceKey, saga: dashboardSaga });
export default compose(
withReducer,
withConnect,
withSaga,
)(Dashboard);
DashboardComponent.tsx
// ....
// This was a functional component
<UserNameForm initChangeUserName = {props.initChangeUserName} />
// ....
UserNameForm.tsx
// ....
this.props.initChangeUserName(this.state.username);
// ....
Не могли бы вы поделиться, что именно не работает? Какое сообщение об ошибке вы получаете? Кроме того, у вас есть опечатка в вашем методе
mapStateToProps()
("dashbaord
").