Javascript 如何将常量值用作flowtype文字?

Javascript 如何将常量值用作flowtype文字?,javascript,flowtype,Javascript,Flowtype,我第一次尝试使用FlowType,但在将常量值指定为类型文本时遇到了麻烦。如何更改以下内容以防止在常量定义和类型声明中使用相同的字符串值 // @flow export const INITIAL = 'INITIAL' export const LOADING = 'LOADING' export const LOADED = 'LOADED' export const FAILED = 'FAILED' export type State = 'INITIAL' | 'LOADING' |

我第一次尝试使用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'
简短回答:你不能(阿飞)

详细回答:你应该重新构造你的程序,去掉那些常量。如果你看看这些常数的好处(即)

  • 它有助于保持命名的一致性,因为所有动作类型都集中在一个地方

  • 有时,您希望在使用新功能之前查看所有现有操作。可能是团队中的某个人已经添加了您需要的操作,但您不知道

  • 在Pull请求中添加、删除和更改的操作类型列表有助于团队中的每个人跟踪新功能的范围和实现

  • 如果在导入动作常量时输入错误,则会导致未定义。当您想知道为什么在发送操作时什么也没有发生时,这比输入错误更容易被注意到

使用变体类型可以实现所有相同的功能

如果您使用的是redux,您可以看到它们是如何使用flow消除常量的:

这不仅可以确保你没有输入错误,而且最后的(action:empty)可以确保你处理了所有的案例

// @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;
  }
}