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

利亚希姆

我正在将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()的更准确的类型输入

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打字稿编译器给出了一个包含生成器函数的代码

来自分类Dev

打字稿:基于另一个属性的属性

来自分类Dev

打字稿:调用另一个类的“方法”

来自分类Dev

打字稿写一个可调用的对象

来自分类Dev

如何编译一个编译器阶段的输出?

来自分类Dev

第一个编译器是如何编译的?

来自分类Dev

仅调用另一个方法的方法的编译器优化

来自分类Dev

编译器对仅包含一个函数调用的函数做了什么

来自分类Dev

React-beautiful-dnd打字稿编译器问题

来自分类Dev

打字稿编译器中的对象速记语法

来自分类Dev

Haxe JS编译器从源代码中删除了一个属性

来自分类Dev

一个状态属性,只要其值更改,它就会透明地调用setState

来自分类Dev

是否允许C ++编译器仅用一个结构替换一下结构+ moveconstruct?

来自分类Dev

是否允许C ++编译器仅用一个结构替换一下结构+ moveconstruct?

来自分类Dev

断言另一个属性后,一个属性的打字稿推断

来自分类Dev

如何告诉编译器“忽略”一个类?

来自分类Dev

更新到下一个Xcode,获取编译器警告自动属性合成不会合成属性

来自分类Dev

为什么编译器调用的是第一个重载函数而不是第二个?

来自分类Dev

是否可以使用夜间编译器编译一个特定的库,并将其链接到在稳定状态下编译的项目?

来自分类Dev

打字稿每课一个文件

来自分类Dev

如何使用Gulp将多个打字稿文件编译为一个javascript文件?

来自分类Dev

F#编译器如何知道正在调用C#方法以及参数需要一个语法元组?

来自分类Dev

现代Java编译器/ JVM内联函数/方法是否完全从一个地方调用?

来自分类Dev

是否可以通知C#编译器基于另一个属性的另一个属性为非null?

来自分类Dev

为什么编译器会发出一个stloc和一个ldloca?

来自分类Dev

仅在每个wordpress页面上调用一个函数

来自分类Dev

打字稿调用可以实现一个接口,并使vars私有吗?

来自分类Dev

打字稿:从当前类的另一个方法调用方法

来自分类Dev

在同一个类中调用函数不起作用,打字稿

Related 相关文章

  1. 1

    打字稿编译器给出了一个包含生成器函数的代码

  2. 2

    打字稿:基于另一个属性的属性

  3. 3

    打字稿:调用另一个类的“方法”

  4. 4

    打字稿写一个可调用的对象

  5. 5

    如何编译一个编译器阶段的输出?

  6. 6

    第一个编译器是如何编译的?

  7. 7

    仅调用另一个方法的方法的编译器优化

  8. 8

    编译器对仅包含一个函数调用的函数做了什么

  9. 9

    React-beautiful-dnd打字稿编译器问题

  10. 10

    打字稿编译器中的对象速记语法

  11. 11

    Haxe JS编译器从源代码中删除了一个属性

  12. 12

    一个状态属性,只要其值更改,它就会透明地调用setState

  13. 13

    是否允许C ++编译器仅用一个结构替换一下结构+ moveconstruct?

  14. 14

    是否允许C ++编译器仅用一个结构替换一下结构+ moveconstruct?

  15. 15

    断言另一个属性后,一个属性的打字稿推断

  16. 16

    如何告诉编译器“忽略”一个类?

  17. 17

    更新到下一个Xcode,获取编译器警告自动属性合成不会合成属性

  18. 18

    为什么编译器调用的是第一个重载函数而不是第二个?

  19. 19

    是否可以使用夜间编译器编译一个特定的库,并将其链接到在稳定状态下编译的项目?

  20. 20

    打字稿每课一个文件

  21. 21

    如何使用Gulp将多个打字稿文件编译为一个javascript文件?

  22. 22

    F#编译器如何知道正在调用C#方法以及参数需要一个语法元组?

  23. 23

    现代Java编译器/ JVM内联函数/方法是否完全从一个地方调用?

  24. 24

    是否可以通知C#编译器基于另一个属性的另一个属性为非null?

  25. 25

    为什么编译器会发出一个stloc和一个ldloca?

  26. 26

    仅在每个wordpress页面上调用一个函数

  27. 27

    打字稿调用可以实现一个接口,并使vars私有吗?

  28. 28

    打字稿:从当前类的另一个方法调用方法

  29. 29

    在同一个类中调用函数不起作用,打字稿

热门标签

归档