reactjs - Typescript & ReactJS 如何动态设置状态

标签 reactjs typescript types

我将此接口(interface)定义为我的状态:

interface State {
  id: string;
  name: string;
  description: string;
  dimensionID: string;
  file: File | null;
  operator: string;
  isFormValid: boolean;
  filename: string;
};

我有一个简单的更改处理程序:

  update = (event: React.FormEvent<HTMLInputElement>): void => {
    const { name, value } = event.currentTarget;
    this.setState({ [name]: value });
  };

但是,会抛出此错误:

Error:(109, 19) TS2345: Argument of type '{ [x: string]: string; }' is not assignable to parameter of type 'State | Pick<State, "id" | "name" | "description" | "dimensionID" | "file" | "operator" | "isFormValid" | "filename"> | ((prevState: Readonly<State>, props: Readonly<Props>) => State | Pick<...>)'.
  Type '{ [x: string]: string; }' is not assignable to type '(prevState: Readonly<State>, props: Readonly<Props>) => State | Pick<State, "id" | "name" | "description" | "dimensionID" | "file" | "operator" | "isFormValid" | "filename">'.
    Type '{ [x: string]: string; }' provides no match for the signature '(prevState: Readonly<State>, props: Readonly<Props>): State | Pick<State, "id" | "name" | "description" | "dimensionID" | "file" | "operator" | "isFormValid" | "filename">'.

我的问题是:如何像更改处理程序尝试的那样动态设置状态? 此处理程序用于表单的不同部分,因此我不知道需要更新哪个状态键。

更新:解决方案 从这个post

  update = (event: React.FormEvent<HTMLInputElement>): void => {
    const { name, value } = event.currentTarget;
    this.setState(prevState => ({
      ...prevState,
      [name]: value,
    }))
  };

有效!

最佳答案

最喜欢的解决方案类型转换。

this.setState({[name]: value} as {[P in keyof State]: State[P]})
// or
this.setState({[name]: value} as Pick<State, keyof State>)

setState 与传播前一个状态

this.setState((prevState) => ({ ...prevState, [name]: value }));

这不会检查类型。对于遇到转译困难的人来说,这只是一种快速解决方法。

this.setState<never>({[name]: value})

相关链接

React setState

Github Tim Roes comment

关于reactjs - Typescript & ReactJS 如何动态设置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53039935/

相关文章:

reactjs - 我们可以将点击处理程序附加到自定义子组件吗

javascript - ReactJS & MobX : TypeError: . .. 不是函数 - 但它是?

typescript - TSLINT:删除导入时缺少的空格规则

c++ - 为什么顺序容器同时具有 size_type 和 difference_type?

jquery - React 组件使用 JQuery 查找 last-of-type 类

typescript - 将引用传递给 setter

javascript - Angular 2 无法在单个 HTML 标签中使用同一个变量两次?

javascript - 如何检查对象是否不是数组?

Java 有界类型参数

reactjs - Material UI + React 测试库 : Unit test Select MenuItem breaks after upgrading to version 4