【问题标题】:Using string enum as Map keys使用字符串枚举作为映射键
【发布时间】:2020-01-15 06:41:24
【问题描述】:

我想使用 TypeScript enum,字符串值为 Map 键:

enum Type {
    a = 'value_a',
    b = 'value_b'
}

const values = new Map<Type, number>();

// set a single value
values.set(Type.a, 1);

这很好用。我只能设置枚举中定义的键。现在我想填充地图,并为 Type 枚举中的所有条目设置值:

// trying to set all values
for (const t in Type) {
  values.set(Type[t], 0); // error
}

然而,这给了我的编译错误“'string' 类型的参数不可分配给'Type' 类型的参数。”

这里推荐的解决方案是什么?执行values.set(Type[t] as Type, 0); 可以解决问题,但我确定一定有更优雅的解决方案?

Code in TypeScript Playground

【问题讨论】:

  • 问题在于Type[t] 可以为您提供枚举值或枚举键:Type['a'] == 'value_a' 和Type['value_a'] == 'a'。其中只有一个是Type.a。这是因为 enum E {A, B} 实际上会生成 E = { 0: "A", 1: "B", "A": 0, "B": 1} - 它会生成两种绑定以确保没有重复项,并且您可以轻松地以任何一种方式访问​​它们。

标签: typescript enums


【解决方案1】:

使用联合类型而不是枚举。

type Type = 'value_a' | 'value_b';
const TYPES: Type[] = ['value_a', 'value_b'];

不好的是,代码重复很少。

好处是,它很简单,您不会遇到意外的行为。归根结底,您不会介意代码重复。

【讨论】:

    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2016-12-13
    • 2021-11-09
    • 2017-12-06
    • 2019-01-29
    相关资源
    最近更新 更多