Redux示例todo应用程序有这样的todo减少器:
https://github.com/reactjs/redux/blob/master/examples/todos/src/reducers/todos.js#L23
ADD_TODO操作在没有状态的情况下工作,但TOGGLE_TODO需要状态。在不编辑代码本身的情况下,如何为类似的reducer编写流类型?
https://flowtype.org/try/#0MYewdgzgLgBFIBMQwLwwBTQIZQKYBoYtgoBLcASlQD4YBvAKBhggHdSpgALDYs8AHRQAngAdcVRs2bAsEXDADkAQQAiqgPoAVAPKqdigFxNpzAE64oAVzNh6J081IJDREuTADn+B47wAPKFc+DyFcQJ9HaVAAW1EAG0tcFxgAMyx4+V9mAFF9fWXklXQBxYoAZAFFtPQNjKNJUjGw8LwQYAIUNBDBZ0ls6QtrWxYoHFwBvIGhmzspKJgBJeaCAZkQOMS8FPaVgViEpIRJ3wRcdKt4oOnLWdHxkzyp0EhYeCQIVCaxvC+AbQAuoQemAqChaPM2BxuLx3IIROJ+qYCgoVOpqvojDdhnY-mtFssfqsFnBECB0FYw GdUqQwMlgXDQQMAfk5KiSuUqrpMXVHDMRnsYlhROhYOD8e9yVAGfwmVEKKdzlLtcovy7CtHgwpuFRCAzLBqcqrqSPkA
我不知道你说的"不编辑代码本身"是什么意思。你需要在一些地方添加类型注释,让Flow对代码进行类型检查。总之,以下是我为您的示例想出的类型:
type Action = {
type: 'ADD_TODO',
id: number,
text: string,
} | {
type: 'TOGGLE_TODO',
id: number,
};
type State = {
id: number,
completed: boolean,
}
以下是完整的试用流程。我认为没有任何好的方法可以向Flow表示,当action.type
是ADD_TODO
时,您只会将undefined
传递给todo
。最好对代码进行一些重组。
请记住,Flow不是银弹。它是一个防止错误和简化开发的好工具,但作为静态检查的回报,你必须放弃一些它无法理解的模式。你会发现,你经常必须围绕Flow所能理解的内容来构建你的代码(顺便说一句,我相信这会带来更好的设计选择,也会让人类更容易理解)。类型安全不是免费的,这是所有类型检查器的基本限制。所以,不要指望它能够在没有你"编辑代码本身"的情况下检查所有内容