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

我在代码注释的两行中都收到此错误。该代码甚至不是我的代码,我是从react官方网站(https://reactjs.org/docs/forms.html)上获得的,但是在这里不起作用。

我正在使用create-react-app工具。


您的问题出在其他地方–请参阅此演示
Ted

我知道,它可以在所有这些“编译器”网站上运行,但是他们建议我使用它来执行github.com/Microsoft/TypeScript-React-Starter项目,并且通过TypeScript编译器无法正常工作
Luis Henrique Zimmermann

Answers:


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,现在可以正常工作,再回答一件事,该语法与TypeScript有关吗?因为在react官方网站上没有类似的内容
Luis Henrique Zimmermann

3
是的,这与打字稿严格相关。
Nitzan Tomer's

1
正确的定义是:Square类扩展React.Component <{value:string},{}> {...}
Rodrigo Perez Burgues

58

除了@ nitzan-tomer的答案,您还可以选择使用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);
  ...
};

只要您保持一致,就可以。


1
请总结一下在您的帖子中一致的含义,这样就可以充分利用它的价值,而无需阅读这篇中篇文章(这是一个非常有用的链接,谢谢)。
卡尔·里希特

9

问题是您尚未声明将接口状态替换为合适的'值'变量类型

这是一个很好的参考

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

interface AppState {
   value: any
}

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

0

event.target类型是EventTarget不总是有一个值。如果是DOM元素,则需要将其转换为正确的类型:

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

尽管显式可能会更好,但这也会推断出状态变量的“正确”类型


我认为他在尝试在构造函数而不是事件处理程序中初始化字符串时遇到错误
Ray_Poly
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.