【问题标题】:How to create initial value for .reduce based on enum?如何基于枚举为 .reduce 创建初始值?
【发布时间】:2021-09-16 21:56:37
【问题描述】:

我有一个简化的函数,它需要基于枚举的初始值。请参阅下面的简化代码:

items.reduce<Record<RoleType, Community[]>>(
    (acc, community) => {
        ... // this works
    },
    { [RoleType.LEADER]: [], [RoleType.FACILITATOR]: [], [RoleType.EDITOR]: [], [RoleType.EXPERT]: [], [RoleType.MEMBER]: [] }
);

枚举看起来像这样:

export enum RoleType {
    EXPERT = 'EXPERT',
    LEADER = 'LEADER',
    FACILITATOR = 'FACILITATOR',
    EDITOR = 'EDITOR',
    MEMBER = 'MEMBER'
}

我不想明确列出枚举的每个成员。我尝试了以下方法:

{ ...Object.values(RoleType).map((role) => ({ [role]: [] })) }

有没有办法为所有枚举成员简单地添加空数组?最好的情况是如果也有正确的输入。

我上面的尝试抛出了这个错误(我真的不知道该怎么办):

输入 '{ [n: number]: { [x: string]: any[]; };长度:数字; toString(): 字符串; toLocaleString(): 字符串; pop(): { [x: string]: any[]; }; push(...items: { [x: string]: any[]; }[]): number; concat(...items: ConcatArray[]): { ...; }[]; concat(...items: ({ ...; } | ConcatArray<...>)[]): { ...; }[];...' 缺少类型 'Record' 的以下属性:专家、领导者、引导者、编辑者、成员

【问题讨论】:

    标签: javascript arrays typescript enums higher-order-functions


    【解决方案1】:
    { ...Object.values(RoleType).map((role) => ({ [role]: [] })) }
    

    将创建一个以数组索引为键的对象。

    {
      "0": { "EXPERT": [] },
      "1": { "LEADER": [] },
      "2": { "FACILITATOR": [] }
      ...
    }
    

    你需要使用这样的东西:

    Object.assign({}, ...Object.values(RoleType).map(r => ({ [r]: [] })))
    

    【讨论】:

    • 这行得通——但为什么呢? :D 你能详细说明一下吗?
    • @sandrooco 你已经知道Object.values(..).map(..) 创建一个对象数组,每个对象都有RoleType 键。当您传播该对象数组时,它变为Object.assign({}, { "EXPERT": [] }, { "LEADER": [] }, { "FACILITATOR": [] }, etc)。它将它们全部合并为一个对象。我之前回答过的一个类似问题:stackoverflow.com/a/67303414.
    • 有道理,感谢您的解释。看懂了就明白了。
    【解决方案2】:

    我制作了一个 TS 转换器,它可以让您获取枚举的所有值等 - 它被称为 ts-reflection,它的工作原理如下:

    enum MyEnum {
      NO = 0,
      MAYBE = 1,
      YES = 2
    }
    
    const valuesOfMyEnum = valuesOf<MyEnum>(); // [0, 1, 2]
    

    Here's how you set it up

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 2014-09-16
      相关资源
      最近更新 更多