Redux Actions:TypeScript枚举成员唯一性?

时间:2018-02-22 15:41:49

标签: javascript typescript redux

我正在将应用程序从JavaScript ES6转换为TypeScript,并且可能会长时间混合使用JavaScript / TypeScript。

我已成功设置了TypeScript Redux(4.0.0-beta.2)存储,并使用枚举定义了一些TypeScript Redux操作:

export enum SignInActionType {
    SignedIn = "SIGNED_IN",
    SignedOut = "SIGNED_OUT",
}

export interface SignInAction extends Action<SignInActionType> {
}

然后,reducer会打开这些值

export const signInReducer: Reducer<SignInState, SignInAction> = (state: SignInState = initialState, action: SignInAction) => {
    switch (action.type) {
        case SignInActionType.SignedIn:
            return {...state, state: SignInType.SignedIn};
        case SignInActionType.SignedOut:
            return {...state, state: SignInType.SignedOut};
    }
    return state;
};

在附加Chrome调试器并单步执行reducer功能后,我可以看到switch语句中的action.type是枚举成员的字符串,例如SIGNED_IN

TypeScript似乎没有检测到枚举成员名称中的重叠。

e.g。

export enum ThisIsAMistake {
    SignMyGuestBook = "SIGNED_IN",
}

我将面临的问题是,即使消息没有针对该减速器,减速器也可能会运行。

其他一些语言(例如Java,或类似于TypeScript - Swift)的枚举“承诺”是,即使两个枚举成员共享一个名称,它们也不一样。

如果我理解正确,这基本上意味着我可以获得更多的编译时间帮助而不会拼错一些东西,但我仍然需要确保字符串是唯一的?

TL; DR

  • TypeScript是否提供表达枚举字符串唯一性的方法?
  • 在TypeScript世界中是否存在标准方法?

1 个答案:

答案 0 :(得分:0)

只需遵循Redux在枚举中使用动作的命名约定(即const ACTION_NAME='ACTION_NAME'

enum ActionTypes {
    FETCH_USERS = 'FETCH_USER'
}

这里的主要思想是,在左侧和右侧,我们总是具有相同的名称(即FETCH_USERS)

如果您尝试执行以下操作-您将收到一条错误消息,提示“重复标识符'FETCH_USERS'”

enum ActionTypes {
    FETCH_USERS = 'FETCH_USER'
    FETCH_USERS = 'FETCH_SOMETHING_ELSE'
}

希望它会有所帮助:)