V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Biwood
V2EX  ›  TypeScript

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

  •  
  •   Biwood · 2021-01-05 17:38:13 +08:00 · 2701 次点击
    这是一个创建于 1178 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如有这样一个 Map:

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

    我写成 Enum:

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

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

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

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

    10 条回复    2021-01-19 22:27:01 +08:00
    EPr2hh6LADQWqRVH
        1
    EPr2hh6LADQWqRVH  
       2021-01-05 17:58:38 +08:00 via Android
    enum 的问题在于
    除了 FruitMap['apple'] === '苹果',
    FruitMap['苹果'] 也 === 'apple',

    和对象以及 Map 还是有点不一样的
    Vegetable
        2
    Vegetable  
       2021-01-05 18:07:30 +08:00
    啊当然不会,enum 的属性是只读的,不能改,只能读。
    这咋当 Map 用啊。
    doommm
        3
    doommm  
       2021-01-05 18:11:35 +08:00   ❤️ 1
    @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
        4
    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
        5
    luob  
       2021-01-05 18:19:34 +08:00 via iPhone
    type Fruit = "apple" | "orange"

    这种写法可能会更合适。
    EPr2hh6LADQWqRVH
        6
    EPr2hh6LADQWqRVH  
       2021-01-05 18:20:08 +08:00
    @doommm 喔是真的,感谢了,原来这个问题是没有的,好魔幻
    Jackeriss
        7
    Jackeriss  
       2021-01-05 18:20:57 +08:00 via iPhone
    这跟语言无关吧,枚举和 map 是两种东西,有什么理由用枚举代替 map ?
    kangyan
        8
    kangyan  
       2021-01-06 17:43:59 +08:00
    完全不会...
    hjylxmhzq
        9
    hjylxmhzq  
       2021-01-13 23:30:16 +08:00
    不会吧,毕竟除了 const enum 之外的 enum 都会转换成运行时的对象,如果不是为了语法上的清晰那为何不直接用对象
    Leviathann
        10
    Leviathann  
       2021-01-19 22:27:01 +08:00
    我写 js 的时候的确是用上面的写法模拟枚举。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4306 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 10:12 · PVG 18:12 · LAX 03:12 · JFK 06:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.