当前位置: 首页 > 面试题库 >

允许打字稿编译器仅在一个反应​​状态属性上调用setState

贺方伟
2023-03-14
问题内容

我正在将Typescript与React一起用于项目。主组件通过此接口获得通过状态。

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

编译器抱怨说,在onChange我仅尝试为一个属性设置状态的方法中,该属性todos和该属性hungry在type中丢失{ editorState: EditorState;}。换句话说,我需要在onChange函数中设置所有三个属性的状态,以使代码得以编译。为了使其编译,我需要做

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

但目前没有理由在代码中设置todoshungry属性。在打字稿/反应中仅对一个属性调用setState的正确方法是什么?


问题答案:

编辑

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

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

Pick<S, K>被内置其中在打字稿2.1添加类型:

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

有关更多信息,请参见映射类型。
如果仍然存在此错误,则可能需要考虑更新您的反应定义。

原始答案:

我正面临着同样的事情。

我设法解决这个烦人的问题的两种方法是:

(1)投射/断言:

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

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

interface MainState {
    todos?: Todo[];
    hungry?: Boolean;
    editorState?: EditorState;
}

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

编辑

虽然这仍然是一个问题,但是有两个关于将解决此问题的新功能的讨论:
部分类型(现有类型的可选属性)
以及
Object.assign和React组件setState()的更准确键入



 类似资料:
  • 问题内容: 我希望能够实例化一个Typescript类,在运行时可以获取该类和构造函数的详细信息。我想编写的函数将包含类名和构造函数参数。 问题答案: 您可以尝试: 编辑 此版本可在TypeScript操场上使用,例如:

  • 问题内容: 我想为我的纯功能组件定义,但出现类型错误: 我知道我可以这样写: 有没有更好的添加方法? 问题答案: 您可以这样输入: 然后,你可以写,而无需强制转换的类型(会)。

  • 我一直在捕捉非数字时遇到问题。 我试过了,但抓不住。如果我让它捕获非数字,但不让用户再次尝试输入。。。它完全停止了我的代码。 这是我的密码:

  • 问题内容: 我有一个JPA实体,其属性设置为 但是,当我在JBoss 6上进行部署时,该应用程序会抛出一条错误消息: 我使用Hibernate 3.5作为JPA 2.0实现。 我应该使用什么来引用外键列? 问题答案: 使用代替:

  • 问题内容: 我有以下组成部分: 是否可以选择需要更新哪些状态属性及其值? 我已经试过了: 这样它就可以像这样使用: 但它不起作用(状态无法更新)。 问题答案: 您可以通过两种方式做到这一点: 或有点更高级: 假设是要更新的属性的名称。

  • 我使用json-schema,并希望只允许在此文件中声明的属性通过验证。例如,如果用户在他们的json对象中传递一个“名称”属性,它将失败这个模式,因为“名称”在这里没有作为属性列出。 是否有一些类似于“必需”的功能只允许列出的属性通过?