Reactjs 如何在不编辑代码本身的情况下定义todo reducer的类型?
Redux示例todo应用程序的todo reducer如下所示: 添加TODO操作在没有状态的情况下工作,但切换TODO需要状态。我怎样才能在不编辑代码本身的情况下为这样的减速器编写flowtype呢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, } | {
我不知道你说的“不编辑代码本身”是什么意思。你需要在一些地方添加类型注释,以便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
。