javascript - React with typescript - 使用 setState 类型安全

标签 javascript reactjs typescript setstate typesafe

所以我最近发现事件处理程序的回调不利于渲染性能:https://reactjs.org/docs/handling-events.html

我试图通过在类方法中获取事件的属性来注意这一点,而不是做类似的事情:onClick={({value}) => this.setState({"someProperty"as keyof状态:值})}

但是现在我不能在该回调中显式声明类型安全,我试图对此保持动态并且我的类型检查器对下面的代码没问题,但是我怎样才能让它提示输入元素有 name 属性不是 keyof State

interface State {
  someProperty: string;
}

class MakeMeSafer extends React.Component<{}, State> {

  state: State = {
    someProperty: ''
  }

  set = ({ currentTarget: { name, value } }: React.SyntheticEvent<HTMLInputElement>): void => {
    this.setState({ [name as keyof State]: value });
  }

  render(): JSX.Element {
    return (
      <div>
        <input type="text" name="some-name-not-in-state" onChange={this.set} />
      </div>
    );
  }

}

最佳答案

您将 name 属性显式转换为 State 的键,因此编译器不会报错是正常的。

如果您需要类型安全,我会改用闭包:

interface State {
  someProperty: string;
}

class MakeMeSafer extends React.Component<{}, State> {

  state: State = {
    someProperty: ''
  }

  onChange = (name: keyof State) =>
    (e: React.FormEvent<HTMLInputElement>) => {
      const newValue = e.currentTarget.value;
      this.setState({name: newValue});
    }
  }

  render(): JSX.Element {
    return (
      <div>
        <input type="text" onChange={this.onChange('some-name-not-in-state')} />
      </div>
    );
  }
}

关于javascript - React with typescript - 使用 setState 类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49972310/

相关文章:

javascript - 使用 WebMIDI API 发送 MIDI 调音请求会导致错误

json - GraphQL/React 抛出网络错误 JSON.parse : unexpected character at line 1 column 1 of the JSON data

javascript - 如何在<Provider>中使用另一个<Consumer>?

javascript - 从 js 到 jsx 的转换工具

angular - 如何使用 typescript 获取页面标题?

css - 如何在Angular2种子元素中实现SCSS?

javascript - 如何通过隐藏输入元素将 PHP 字符串变量传递给 Javascript 函数

javascript - 使用 css 更改图像并为其添加动画

javascript - 鼠标悬停并单击时停止 SetTimeout

node.js - Firebase功能错误; "Maximum call stack size exceeded"