我正在为一个项目使用带有React的Typescript.主组件通过此接口获得传递状态.

interface MainState {
  todos: Todo[];
  hungry: Boolean;
  editorState: EditorState;  //this is from Facebook's draft js
}

但是,下面的代码(仅摘录)将无法编译.

class Main extends React.Component<MainProps, MainState> {
  constructor(props) {
    super(props);
    this.state = { todos: [], hungry: true, editorState: EditorState.createEmpty() };
  }
  onChange(editorState: EditorState) {
    this.setState({
      editorState: editorState
    });
  }
}

编译器抱怨说,在我只try 为一个属性设置state的onChange方法中,{ editorState: EditorState;}类型中缺少属性todos和属性hungry.换句话说,我需要设置onChange函数中所有三个属性的状态,以使代码能够编译.要编译它,我需要

onChange(editorState: EditorState){
  this.setState({
    todos: [],
    hungry: false,
    editorState: editorState
  });
}

但是没有理由在代码中的这一点上设置todoshungry属性.在typescript/react中,只对一个属性调用setState的正确方法是什么?

推荐答案

编辑

react的定义已更新,setState的签名现在为:

setState<K extends keyof S>(state: Pick<S, K>, callback?: () => any): void;

其中Pick<S, K>是在Typescript 2.1中添加的内置类型:

type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
}

更多信息请参见Mapped Types

原始答案:

我也面临同样的问题.

我有两种方法来解决这个恼人的问题:

(1) 铸造/断言:

this.setState({
    editorState: editorState
} as MainState);

(2) 将接口字段声明为可选:

interface MainState {
    todos?: Todo[];
    hungry?: Boolean;
    editorState?: 编辑orState;
}

如果有人有更好的解决方案,我会很高兴!


编辑

While this is still an issue, there are two discussions on new features that will solve this problem:
Partial Types (Optionalized Properties for Existing Types)
and
More accurate typing of Object.assign and React component setState()

Typescript相关问答推荐

Typescript问题和缩减器状态不会在单击时添加用途.属性'状态和调度'不存在于userContextType类型上'|null'

相同端点具有不同响应时的RTKQuery类型定义

如何基于对象关键字派生类型?

使用React处理Websocket数据

在泛型类型中对子代执行递归时出错

在键和值为ARGS的泛型函数中未正确推断类型

部分类型化非 struct 化对象参数

使用TypeScrip根据(可选)属性推断结果类型

我可以使用TypeScrip从字符串词典/记录中填充强类型的环境对象吗?

用于验证字符串变量的接口成员

react 路由Use RouteLoaderData类型脚本错误

如何以Angular 导入其他组件S配置文件

如何将对象数组中的键映射到另一种对象类型的键?

TYPE FOR ARRAY,其中每个泛型元素是单独的键类型对,然后在该数组上循环

API文件夹内的工作员getAuth()帮助器返回:{UserID:空}

缩小对象具有某一类型的任意字段的范围

使用NextJS中间件重定向,特定页面除外

Typescript泛型验证指定了keyof的所有键

Typescript 从泛型推断类型

如何在Typescript 中定义具有相同类型的两个泛型类型的两个字段?