如何在不编辑代码本身的情况下定义todo减速器的类型



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.typeADD_TODO时,您只会将undefined传递给todo。最好对代码进行一些重组。

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

相关内容

最新更新