【问题标题】:Redux Actions: TypeScript enum member uniqueness?Redux Actions:TypeScript 枚举成员的唯一性?
【发布时间】:2018-02-22 15:41:48
【问题描述】:

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

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

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 似乎没有检测到枚举成员名称中的重叠。

例如

export enum ThisIsAMistake {
    SignMyGuestBook = "SIGNED_IN",
}

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

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

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

TL;DR

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

【问题讨论】:

标签: javascript typescript redux


【解决方案1】:

只需遵循 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'
}

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多