TypeScript 里你会把 Enum 当作 Map 用吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Biwood
V2EX    TypeScript

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

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

    比如有这样一个 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     Solana     933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 22:06 PVG 06:06 LAX 14:06 JFK 17:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86