Muszę utworzyć formularz, który będzie wyświetlał coś na podstawie wartości zwracanej przez API. Pracuję z następującym kodem:
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>
);
}
}
Otrzymuję następujący błąd:
error TS2339: Property 'value' does not exist on type 'Readonly<{}>'.
Otrzymałem ten błąd w dwóch wierszach, które skomentowałem w kodzie. Ten kod nie jest nawet mój, mam go z oficjalnej strony React ( https://reactjs.org/docs/forms.html ), ale tutaj nie działa.
Używam narzędzia do tworzenia i reagowania.
reactjs
typescript
Luis Henrique Zimmermann
źródło
źródło
Odpowiedzi:
Definicja
Component
jest następująca :Co oznacza, że typ domyślny dla państwa (i rekwizytów) wynosi:
{}
.Jeśli chcesz, aby twój komponent był
value
w stanie, musisz go zdefiniować w następujący sposób:Lub:
źródło
Oprócz odpowiedzi @ nitzan-tomer masz również możliwość korzystania z inferfaces :
Albo jest w porządku, o ile jesteś konsekwentny.
źródło
Problem polega na tym, że nie zadeklarowałeś swojego stanu interfejsu, zastąp go odpowiednim typem zmiennej „wartość”
Oto dobre odniesienie
źródło
event.target
jest typu,EventTarget
który nie zawsze ma wartość. Jeśli jest to element DOM, musisz rzucić go na odpowiedni typ:Pozwoli to również wywnioskować „prawidłowy” typ zmiennej stanu, chociaż podanie jawności jest prawdopodobnie lepsze
źródło