TypeScript 里你会把 Enum 当作 Map 用吗?

2021-01-05 17:38:13 +08:00
 Biwood

比如有这样一个 Map:

const FruitMap = {
  apple: '苹果',
  orange: '橙子'
}

我写成 Enum:

enum FruitMap {
  'apple' = '苹果',
  'orange' = '橙子'
}

有时候我需要获取 Map 中的值,我会这样写:

const fruitName = FruitMap['apple']; // '苹果'

我感觉用 Enum 替代 Map 似乎不太合适,Enum 应该不是这么用的对吧?

3008 次点击
所在节点    TypeScript
10 条回复
EPr2hh6LADQWqRVH
2021-01-05 17:58:38 +08:00
enum 的问题在于
除了 FruitMap['apple'] === '苹果',
FruitMap['苹果'] 也 === 'apple',

和对象以及 Map 还是有点不一样的
Vegetable
2021-01-05 18:07:30 +08:00
啊当然不会,enum 的属性是只读的,不能改,只能读。
这咋当 Map 用啊。
doommm
2021-01-05 18:11:35 +08:00
@avastms 不对吧,当 enum 的 value 值是字符串的时候,FruitMap['苹果'] 这种写法是无效的,文档里有提到 https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings

“Keep in mind that string enum members do not get a reverse mapping generated at all.”
gucheen
2021-01-05 18:18:33 +08:00
> Enums allow a developer to define a set of named constants. Using enums can make it easier to document intent, or create a set of distinct cases.

官方文档一开始就说明了这个 Enum 的用途,其实就是一组具名常量。
你通过 Enum 获取 value 是没问题的,但是把它当成 Map 或者 Object 用就不对了
luob
2021-01-05 18:19:34 +08:00
type Fruit = "apple" | "orange"

这种写法可能会更合适。
EPr2hh6LADQWqRVH
2021-01-05 18:20:08 +08:00
@doommm 喔是真的,感谢了,原来这个问题是没有的,好魔幻
Jackeriss
2021-01-05 18:20:57 +08:00
这跟语言无关吧,枚举和 map 是两种东西,有什么理由用枚举代替 map ?
kangyan
2021-01-06 17:43:59 +08:00
完全不会...
hjylxmhzq
2021-01-13 23:30:16 +08:00
不会吧,毕竟除了 const enum 之外的 enum 都会转换成运行时的对象,如果不是为了语法上的清晰那为何不直接用对象
Leviathann
2021-01-19 22:27:01 +08:00
我写 js 的时候的确是用上面的写法模拟枚举。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/741949

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX