我第一次尝试使用FlowType,并且在将常量值指定为类型文字时遇到了麻烦。如何更改以下内容以防止在常量定义和类型声明中使用相同的字符串值?
// @flow
export const INITIAL = 'INITIAL'
export const LOADING = 'LOADING'
export const LOADED = 'LOADED'
export const FAILED = 'FAILED'
export type State = 'INITIAL' | 'LOADING' | 'LOADED' | 'FAILED'
答案 0 :(得分:1)
简答:你不能(AFAIK)
答案很长:你应该重构你的程序以摆脱这些常数。如果你看一下这些常数的好处(即What is the point of the constants in redux?)
它有助于保持命名的一致性,因为所有操作类型都集中在一个地方。
有时您希望在处理新功能之前查看所有现有操作。可能你需要的行动已经被团队中的某个人添加,但你不知道。
在Pull Request中添加,删除和更改的操作类型列表可帮助团队中的每个人跟踪新功能的范围和实施。
如果在导入动作常量时输入拼写错误,则会得到未定义的内容。当你想知道为何在调度行动时没有任何反应时,这比输入错字更容易注意到。
使用变体类型可以实现所有相同的事情。
如果你正在使用redux,你可以看到他们如何使用flow in the docs about using redux with flow消除常量:
// @flow
type State = { +value: boolean };
type FooAction = { type: "FOO", foo: boolean };
type BarAction = { type: "BAR", bar: boolean };
type Action = FooAction | BarAction;
function reducer(state: State, action: Action): State {
switch (action.type) {
case "FOO": return { ...state, value: action.foo };
case "BAR": return { ...state, value: action.bar };
default:
(action: empty);
return state;
}
}
这不仅可以确保你没有拼写错误,而且不会,但最后(action:empty)确保你处理所有情况。