プロパティ '値'はタイプ 'Readonly <{}>'に存在しません


155

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<{}>'.

コードにコメントした2行でこのエラーが発生しました。このコードは私のものでもありません。reactの公式サイト(https://reactjs.org/docs/forms.html)から入手しましたが、ここでは機能していません。

私はcreate-react-appツールを使用しています。


あなたの問題の嘘は他の場所-を参照してこのデモ
テッド

私は知っていますが、これらすべての「コンパイラ」Webサイトで機能しますが、プロジェクトgithub.com/Microsoft/TypeScript-React-Starterを実行するためにこれを使用するようにアドバイスされました。TypeScriptCompliterを介しても機能しません
Luis Henrique Zimmermann

回答:


264

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> {
    ...
}

3
omg、ty dude、それは今はうまくいきました、もう1つだけ答えてください。この構文はTypeScriptに関連していますよね 反応公式サイトには同様のものがないため
Luis Henrique Zimmermann

3
はい、これは厳密にタイプスクリプトに関連しています。
Nitzan Tomer 2017年

1
正しい定義は次のとおりです。classSquare extends React.Component <{value:string}、{}> {...}
Rodrigo Perez Burgues

58

@ nitzan-tomerの回答に加えて、インターフェースを使用するオプションもあります。

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

一貫している限り、どちらでもかまいません。


1
中程度の記事を読まなくてもその価値を最大限に引き出すことができるように、投稿の文脈での一貫性の意味を要約してください(これは非常に便利なリンクです、ありがとう)。
Karl Richter、

9

問題は、インターフェイスの状態を宣言していないことで、「値」の適切な変数タイプに置き換えます

これは良い参考文献です

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

interface AppState {
   value: any
}

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

0

event.targetEventTarget常に値があるとは限らないタイプです。DOM要素の場合は、正しい型にキャストする必要があります。

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

これは、状態変数の「正しい」タイプも推測しますが、おそらく明示的である方が良いでしょう


イベントハンドラーではなく、コンストラクターで文字列を初期化しようとすると、エラーが発生すると思います
Ray_Poly
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.