Je suis nouveau sur Redux et nouveau sur TypeScript.
J'ai trouvé une assez bonne version de base de ce que j'essaie de faire dans la documentation de react-redux .
Le code est comme ceci:
import * as actionCreators from '../actions/index'
import { bindActionCreators } from 'redux'
import React, { Component } from 'react'
import { connect } from 'react-redux'
class TodoApp extends Component {
render() {
return (<div>test!</div>)
}
}
function mapStateToProps(state) {
return { todos: state.todos }
}
function mapDispatchToProps(dispatch) {
return { actions: bindActionCreators(actionCreators, dispatch) }
}
export default connect(mapStateToProps, mapDispatchToProps)(TodoApp)
Mon éditeur de code (VS Code avec l'extension TSLint) et tsc
mettent en évidence cette dernière (TodoApp)
comme une erreur, et voici le message que je reçois:
src/components/test.tsx (20,61): erreur TS2345: L'argument de type 'typeof TodoApp' n'est pas attribuable au paramètre de type 'ComponentType <{todos: any; } & {actions: typeof "(filepath) ... '. Le type' typeof TodoApp 'n'est pas assignable au type' StatelessComponent <{todos: any;} & {actions: typeof" (filepath) ... '. Le type 'typeof TodoApp' ne fournit aucune correspondance pour la signature '(props: {todos: any;} & {actions: typeof "(filepath)/actions/index";} & {children ?: ReactNode;}, context ?: any ): ReactElement | nul'.
20 Exporter la connexion par défaut (mapStateToProps, mapDispatchToProps) (TodoApp)
Mon problème est que je ne comprends pas exactement ce que font mapStateToProps
et connect
, mais avant de comprendre,
J'aimerais savoir s'il y a un changement de code que je peux faire ici pour corriger cette "erreur" TypeScript.
Votre composant react n'attend aucun accessoire, donc votre connect
a une erreur car il en déduit que mapStateToProps
et mapDispatchToProps
doivent tous deux retourner des objets vides
Vous pouvez contourner ce problème en ajoutant des définitions de type pour les accessoires de réaction, mais il y a aussi beaucoup d'utilisation dangereuse de any
implicite. Si vous deviez taper entièrement cette application pour des raisons de sécurité, cela ressemblerait à ceci ...
interface ITodo {
description: string
}
interface ITodosState {
todos: ITodo[]
}
interface ITodoProps {
todos: ITodo[]
}
interface ITodoActionProps {
someAction: () => void
}
class TodoApp extends React.Component<ITodoProps & ITodoActionProps> {
render() {
return (<div>test!</div>)
}
}
function mapStateToProps(state: ITodosState): ITodoProps {
return { todos: state.todos }
}
function mapDispatchToProps(dispatch: Dispatch<ITodosState>): ITodoActionProps {
return bindActionCreators({ someAction: actionCreators.someAction }, dispatch)
}
export default connect<ITodoProps, ITodoActionProps, {}>(mapStateToProps, mapDispatchToProps)(TodoApp)
Vous n'avez pas tapé les accessoires de TodoApp
.
type Props = {
todos: any[] // What ever the type of state.todos is
actions: {
addTodo: Dispatch<any>
}
}
class TodoApp extends React.Component<Props> {
render() {
return <div>test!</div>
}
}