La proprietà 'value' non esiste sul tipo 'Readonly <{}>'


155

Devo creare un modulo che visualizzi qualcosa in base al valore restituito di un'API. Sto lavorando con il seguente codice:

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>
    );
  }
}

Ricevo il seguente errore:

error TS2339: Property 'value' does not exist on type 'Readonly<{}>'.

Ho riscontrato questo errore nelle due righe che ho commentato sul codice. Questo codice non è nemmeno mio, l'ho preso dal sito ufficiale di reazione ( https://reactjs.org/docs/forms.html ), ma non funziona qui.

Sto usando lo strumento create-reagire-app.


Il tuo problema si trova altrove - vedi questa demo
Ted

lo so, funziona su tutti questi siti Web "compilatore", ma mi hanno consigliato di usarlo per fare il progetto github.com/Microsoft/TypeScript-React-Starter , e attraverso il compliter TypeScript, non funziona
Luis Henrique Zimmermann

Risposte:


264

Si Component definisce così:

interface Component<P = {}, S = {}> extends ComponentLifecycle<P, S> { }

Il che significa che il tipo predefinito per lo stato (e oggetti di scena) è: {}.
Se si desidera che il componente abbia valuelo stato, è necessario definirlo in questo modo:

class App extends React.Component<{}, { value: string }> {
    ...
}

O:

type MyProps = { ... };
type MyState = { value: string };
class App extends React.Component<MyProps, MyState> {
    ...
}

3
Oh mio Dio, ora ha funzionato, rispondimi solo un'altra cosa, questa sintassi è correlata a TypeScript giusto? perché nel sito ufficiale di reagire non ha nulla di simile
Luis Henrique Zimmermann,

3
Sì, questo è strettamente legato al dattiloscritto.
Nitzan Tomer,

1
Il diritto definito è: class Square estende React.Component <{value: string}, {}> {...}
Rodrigo Perez Burgues

58

Oltre alla risposta di @nitzan-tomer, hai anche la possibilità di usare le inferfacce :

interface MyProps {
  ...
}

interface MyState {
  value: string
}

class App extends React.Component<MyProps, MyState> {
  ...
}

// Or with hooks, something like

const App = ({}: MyProps) => {
  const [value, setValue] = useState<string>(null);
  ...
};

O va bene, purché tu sia coerente.


1
Riassumi ciò che significa coerente nel contesto del tuo post in modo che sia possibile avere il suo pieno valore senza la necessità di leggere l'articolo medio (che è un ottimo link utile, grazie).
Karl Richter,

9

Il problema è che non hai dichiarato che lo stato dell'interfaccia è stato sostituito con il tipo di variabile adatto del "valore"

Ecco un buon riferimento

interface AppProps {
   //code related to your props goes here
}

interface AppState {
   value: any
}

class App extends React.Component<AppProps, AppState> {
  // ...
}

0

event.targetè di tipo EventTargetche non ha sempre un valore. Se è un elemento DOM devi castarlo nel tipo corretto:

handleChange(event) {
    this.setState({value: (event.target as HTMLInputElement).value});
}

Questo inferirà anche il tipo "corretto" per la variabile di stato sebbene essere esplicito sia probabilmente migliore


Penso che ottenga l'errore quando tenta di inizializzare la stringa nel costruttore, non il gestore eventi
Ray_Poly
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.