Свойство '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> {
  // ...
}