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

请教一下 typescript 下 enum 的 name 和 value 的问题?

  •  
  •   yazoox · 2020-10-29 09:22:24 +08:00 · 2013 次点击
    这是一个创建于 1471 天前的主题,其中的信息可能已经有所发展或是发生改变。
    enum Month {  
        Jan='January',  
        Feb = 'February',  
        Mar='March'  
    }
    
    console.log(Month.Feb);
      
    for(var n in Month) {  
        console.log(n);
        console.log(Month[n]);
    }  
    
    

    输出如下:

    [LOG]: "February" 
    [LOG]: "Jan" 
    [LOG]: "January" 
    [LOG]: "Feb" 
    [LOG]: "February" 
    [LOG]: "Mar" 
    [LOG]: "March" 
    

    但是编译器总是“提示”/“报错”:

    Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'typeof Month'. No index signature with a parameter of type 'string' was found on type 'typeof Month'.
    

    string 不能用于 enum 访问的 index 么?

    但是结果,似乎又能够正常工作。不是很理解。

    又比如:

    const a : Month = Month["Jan"];
    console.log(a);
    console.log(typeof a);
    
    [LOG]: "January" 
    [LOG]: "string" 
    

    我已经指定 a 的 type 是 Month,编译器没有报错,但是打印出来,typeof a 是 string

    翻了半天 typescript 的文档,貌似也没有解释得很清楚。

    7 条回复    2020-10-29 14:55:12 +08:00
    noe132
        1
    noe132  
       2020-10-29 09:40:12 +08:00 via Android
    enum 不应该当作 object 来用。
    const enum 实际上根本不存在 runtine object 。
    而且 number enum 有 reverse mapping 。
    Perry
        2
    Perry  
       2020-10-29 09:44:27 +08:00
    TypeScript 最后会 transpile 成 JavaScript,这些 enum 最后还是会变成你定义的 string
    xiaojie668329
        3
    xiaojie668329  
       2020-10-29 09:54:01 +08:00 via iPhone
    Month 是个类型,你把它当值来用不大合适吧。虽然 enum 的特性最终是可以遍历的。
    yazoox
        4
    yazoox  
    OP
       2020-10-29 10:12:44 +08:00
    @noe132 研究了一下,确实。直接使用 number enum 更好。反正他也会添加 string 的(通过 reverse maaping )
    gouflv
        5
    gouflv  
       2020-10-29 10:49:29 +08:00 via iPhone
    enum 我一般会再配合一个 {[enumKey]:name }的对象做取值
    yazoox
        6
    yazoox  
    OP
       2020-10-29 14:44:33 +08:00
    @gouflv 不好意思,能多讲一些么?没有看明白。谢谢!
    ifsct
        7
    ifsct  
       2020-10-29 14:55:12 +08:00 via iPhone
    后半部分,你是不是弄混了 ts 的 typeof 和 js 的 typeof😢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2850 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:09 · PVG 21:09 · LAX 05:09 · JFK 08:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.