Reactjs 如何在不编辑代码本身的情况下定义todo reducer的类型?

Reactjs 如何在不编辑代码本身的情况下定义todo reducer的类型?,reactjs,redux,flowtype,Reactjs,Redux,Flowtype,Redux示例todo应用程序的todo reducer如下所示: 添加TODO操作在没有状态的情况下工作,但切换TODO需要状态。我怎样才能在不编辑代码本身的情况下为这样的减速器编写flowtype呢 我不知道你说的“不编辑代码本身”是什么意思。你需要在一些地方添加类型注释,以便Flow对代码进行类型检查。无论如何,以下是我为您的示例提出的类型: type Action = { type: 'ADD_TODO', id: number, text: string, } | {

Redux示例todo应用程序的todo reducer如下所示:

添加TODO操作在没有状态的情况下工作,但切换TODO需要状态。我怎样才能在不编辑代码本身的情况下为这样的减速器编写flowtype呢


我不知道你说的“不编辑代码本身”是什么意思。你需要在一些地方添加类型注释,以便Flow对代码进行类型检查。无论如何,以下是我为您的示例提出的类型:

type Action = {
  type: 'ADD_TODO',
  id: number,
  text: string,
} | {
  type: 'TOGGLE_TODO',
  id: number,
};

type State = {
  id: number,
  completed: boolean,
}
这是完整的。我不认为有任何好的方式来表示当
操作时,您只会将
未定义的
传递给
todo
。type
添加todo
。最好稍微重新构造代码


请记住,流动不是一颗银弹。它是一个防止bug和简化开发的好工具,但作为静态检查的回报,您必须放弃一些它无法理解的模式。您会发现,您经常必须围绕流可以理解的内容来构建代码(顺便说一句,我相信这会导致更好的设计选择,并使人类更容易理解)。类型安全不是免费的,这是所有类型检查器的一个基本限制。因此,不要期望它能够在没有“编辑代码本身”的情况下检查所有内容。

我希望能够根据操作定义函数接受的状态。无论如何,谢谢你的回答!可以使用包含状态和动作的不相交联合(类似于我用于动作类型的联合)。如果操作是ADD_TODO,那么状态将被忽略。但这可能过于冗长和混乱。除了重新构造代码,我不知道还有什么好的解决方案。当心任何涉及
declare
关键字的答案——它看起来像是打字检查,但你会失去安全性,因为Flow盲目信任
declare