Properti 'value' tidak ada pada tipe 'Readonly <{}>'

155

Saya perlu membuat formulir yang akan menampilkan sesuatu berdasarkan nilai pengembalian API. Saya bekerja dengan kode berikut:

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

Saya mendapatkan kesalahan berikut:

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

Saya mendapatkan kesalahan ini dalam dua baris yang saya komentari pada kode. Kode ini bahkan bukan milik saya, saya mendapatkannya dari situs resmi reaksi ( https://reactjs.org/docs/forms.html ), tetapi tidak berfungsi di sini.

Saya menggunakan alat buat-reaksi-aplikasi.

Luis Henrique Zimmermann
sumber
Masalah Anda ada di tempat lain - lihat Demo ini
Ted
saya tahu, ini bekerja pada semua situs web "kompiler" ini, tetapi mereka menyarankan saya untuk menggunakan ini untuk melakukan proyek github.com/Microsoft/TypeScript-React-Starter , dan melalui pengadu TypeScript, itu tidak berfungsi
Luis Henrique Zimmermann

Jawaban:

264

The Component didefinisikan seperti:

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

Yang berarti bahwa jenis default untuk negara (dan alat peraga) adalah: {}.
Jika Anda ingin komponen Anda memiliki valuestatus maka Anda perlu mendefinisikannya seperti ini:

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

Atau:

type MyProps = { ... };
type MyState = { value: string };
class App extends React.Component<MyProps, MyState> {
    ...
}
Nitzan Tomer
sumber
3
omg, ty bung, itu berfungsi sekarang, jawab saja satu hal lagi, sintaks ini terkait dengan TypeScript kan? karena dalam reaksi situs resmi itu tidak ada yang serupa
Luis Henrique Zimmermann
3
Ya, ini terkait skrip ketat.
Nitzan Tomer
1
Definisi kanan adalah: class Square memperluas React.Component <{value: string}, {}> {...}
Rodrigo Perez Burgues
58

Selain jawaban @ nitzan-tomer, Anda juga memiliki opsi untuk menggunakan inferfaces :

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

Baik-baik saja, selama Anda konsisten.

Leo
sumber
1
Tolong simpulkan apa artinya konsisten dalam konteks posting Anda sehingga mungkin untuk memiliki nilai penuh tanpa perlu membaca artikel media (yang merupakan tautan yang sangat berguna, terima kasih).
Karl Richter
9

Masalahnya adalah Anda belum mendeklarasikan status antarmuka Anda menggantikan apa pun dengan jenis variabel 'nilai' yang sesuai.

Ini referensi yang bagus

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

interface AppState {
   value: any
}

class App extends React.Component<AppProps, AppState> {
  // ...
}
Minuka ArTy Weerathunga
sumber
0

event.targetadalah tipe EventTargetyang tidak selalu memiliki nilai. Jika elemen DOM, Anda harus melemparkannya ke jenis yang benar:

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

Ini akan menyimpulkan tipe "benar" untuk variabel keadaan juga meskipun menjadi eksplisit mungkin lebih baik

apokryfos
sumber
Saya pikir dia mendapatkan kesalahan ketika mencoba untuk menginisialisasi string di konstruktor, bukan pengendali acara
Ray_Poly