Свойство 'value' не существует в типе 'Readonly <{}>'
Мне нужно создать форму, которая будет отображать что-то на основе возвращаемого значения API. Я работаю со следующим кодом:
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>
);
}
}
Я получаю следующую ошибку:
error TS2339: Property 'value' does not exist on type 'Readonly<{}>'.
Я получил эту ошибку в двух строках, которые прокомментировал код. Этот код даже не мой, я получил его с официального сайта реакции (https://reactjs.org/docs/forms.html), но здесь он не работает.
Я использую инструмент создания-реакции-приложения.
Ответы
Ответ 1
Component
определяется следующим образом:
interface Component<P = {}, S = {}> extends ComponentLifecycle<P, S> { }
Это означает, что тип по умолчанию для состояния (и реквизита): {}
.
Если вы хотите, чтобы ваш компонент имел value
в состоянии, вам необходимо определить его следующим образом:
class App extends React.Component<{}, { value: string }> {
...
}
Или же:
type MyProps = { ... };
type MyState = { value: string };
class App extends React.Component<MyProps, MyState> {
...
}
Ответ 2
В дополнение к ответу @nitzan-tomer у вас также есть возможность использовать внешние интерфейсы:
interface MyProps {
...
}
interface MyState {
value: string
}
class App extends React.Component<MyProps, MyState> {
...
}
Либо хорошо, если вы последовательны.
Ответ 3
Проблема в том, что вы не объявили свое состояние интерфейса
замените любой подходящим типом переменной "значение"
Вот хорошая ссылка
interface AppProps {
//code related to your props goes here
}
interface AppState {
value: any
}
class App extends React.Component<AppProps, AppState> {
// ...
}