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

Eri*_*vic 5 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> {
}
Run Code Online (Sandbox Code Playgroud)

然后减速器打开这些值

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;
};
Run Code Online (Sandbox Code Playgroud)

在附加 Chrome 调试器并进入 reducer 函数后,我可以看到action.typeswitch 语句中是枚举成员的字符串,例如SIGNED_IN.

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

例如

export enum ThisIsAMistake {
    SignMyGuestBook = "SIGNED_IN",
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

TL; 博士

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

小智 1

只需遵循 Redux 使用操作的命名约定(即const ACTION_NAME='ACTION_NAME'在枚举内部。

enum ActionTypes {
    FETCH_USERS = 'FETCH_USER'
}
Run Code Online (Sandbox Code Playgroud)

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

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

enum ActionTypes {
    FETCH_USERS = 'FETCH_USER'
    FETCH_USERS = 'FETCH_SOMETHING_ELSE'
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)