J'ai besoin de créer un formulaire qui affichera quelque chose basé sur la valeur de retour d'une API. Je travaille avec le code suivant:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {value: ''};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({value: event.target.value});
}
handleSubmit(event) {
alert('A name was submitted: ' + this.state.value); //error here
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" value={this.state.value} onChange={this.handleChange} /> // error here
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
Je reçois l'erreur suivante:
error TS2339: Property 'value' does not exist on type 'Readonly<{}>'.
J'ai eu cette erreur dans les deux lignes que j'ai commentées sur le code. Ce code n'est même pas le mien, je l'ai eu sur le site officiel de réaction ( https://reactjs.org/docs/forms.html ), mais cela ne fonctionne pas ici.
J'utilise l'outil create-react-app.
La Component
est définie comme ceci:
interface Component<P = {}, S = {}> extends ComponentLifecycle<P, S> { }
Cela signifie que le type par défaut pour l'état (et les accessoires) est: {}
.
Si vous voulez que votre composant ait value
dans l'état, vous devez le définir comme suit:
class App extends React.Component<{}, { value: string }> {
...
}
Ou:
type MyProps = { ... };
type MyState = { value: string };
class App extends React.Component<MyProps, MyState> {
...
}
En plus de la réponse de @ nitzan-tomer, vous avez également la possibilité d’utiliser des inferfaces :
interface MyProps {
...
}
interface MyState {
value: string
}
class App extends React.Component<MyProps, MyState> {
...
}
soit c'est bien, tant que vous êtes cohérent.