'Değer' özelliği 'Salt okunur <{}>' türünde mevcut değil


155

Ben bir API dönüş değeri dayalı bir şey görüntüleyecek bir form oluşturmak gerekir. Aşağıdaki kod ile çalışıyorum:

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

Aşağıdaki hatayı alıyorum:

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

Ben kod üzerinde yorum iki satırda bu hatayı aldım. Bu kod benim değil, tepki resmi sitesinden aldım ( https://reactjs.org/docs/forms.html ), ancak burada çalışmıyor.

Oluştur-tepki-uygulama aracını kullanarak im.


Sorununuz başka bir yerde yatıyor - Bu demoya
Ted

biliyorum, tüm bu "derleyici" web sitelerinde çalışıyor, ama onlar bunu github.com/Microsoft/TypeScript-React-Starter ve TypeScript derleyici aracılığıyla, bu işe yaramazsa kullanmak için tavsiye tavsiye
Luis Henrique Zimmermann

Yanıtlar:


264

Bu Component şekilde tanımlanır :

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

Devlet (ve sahne) için varsayılan türü olduğunu Anlamı: {}.
Bileşeninizin durumunun olmasını istiyorsanız, valuebunu şu şekilde tanımlamanız gerekir:

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

Veya:

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

3
omg, ty dude, şimdi çalıştı, sadece bir şey daha cevapla, bu sözdizimi TypeScript ile ilgili değil mi? tepki resmi sitede benzer bir şey yok
Luis Henrique Zimmermann

3
Evet, bu kesinlikle daktilo ile ilgilidir.
Nitzan Tomer

1
Doğru tanım: class Square, React.Component <{value: string}, {}> {...}
Rodrigo Perez Burgues'ı

58

@ Nitzan-TÖMER'in cevap ek olarak, ayrıca kullanım seçeneğine sahip 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);
  ...
};

Tutarlı olduğunuz sürece her ikisi de iyidir.


1
Lütfen yazınızın bağlamında tutarlı olan ne anlama geldiğini özetleyin, böylece orta makaleyi okumaya gerek kalmadan tam değerini elde etmek mümkün olur (bu çok faydalı bir bağlantıdır, teşekkür ederim).
Karl Richter

9

Sorun, arabirim durumunuzu uygun değişken değeri olan "değer" ile değiştirdiğinizi bildirmemenizdir

İşte iyi bir referans

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

interface AppState {
   value: any
}

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

0

event.targettiptedir EventTargether zaman bir değer yoktur. Bir DOM öğesiyse, onu doğru türe yayınlamanız gerekir:

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

Bu durum, açık değişken olması muhtemelen daha iyi olsa da, durum değişkeni için "doğru" türü çıkaracaktır.


Olay işleyicisini değil, yapıcıdaki dizgiyi başlatmaya çalıştığında hatayı aldığını düşünüyorum
Ray_Poly
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.