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

你们 typescript 用自带枚举还是字符串枚举,感觉字符串枚举类型用起来有点不可靠啊

  •  1
     
  •   june4 · 3 天前 · 926 次点击

    比如:

    type InputType = 'text' | 'number'
    let e: InputType | undefined = 'text'
    const getHtmlStr = (t: InputType | undefined) => `${t === 'text' ? 'type=text' : '...'}`
    

    我给枚举来个重命名吧,把 'text' 改成 'text2',下面用到的地方全都没有改过来,要手动改。

    10 条回复    2025-03-29 22:53:03 +08:00
    xuld
        1
    xuld  
       3 天前
    使用“枚举”还是“字符串联合类型”,关键看目的是强调类型还是强调值。

    1. 枚举需要记忆枚举的名字,不需要记忆具体有哪些项(因为可以点出来
    2. 字符串联合需要记忆具体的内容,且内容和程序逻辑有密切关系

    至于你说的重命名没有自动改过来,这只是实现的一个差异,未来可能会被抹平,但不应该为了这点差异而影响用谁的决策
    DOLLOR
        2
    DOLLOR  
       3 天前
    用 object as const 。

    还有最新的 TS 5.8 推出了 erasableSyntaxOnly 开关,会禁用 enmu 语法,我觉得淘汰 enum 可能是大势所趋了。
    june4
        3
    june4  
    OP
       3 天前
    @xuld 枚举也不用记名字啊,vscode 参数补全可以弹出来枚举名字并在第一位,用起来和字符串没多大差别。而字符串到处传来传去心里不踏实,总得会丢掉枚举的类型约束,肉眼也看不出来。
    june4
        4
    june4  
    OP
       3 天前
    @DOLLOR enum 要废弃确实有点不爽,ts 应该把 enum 关键字和 object as const 来个缝合,把 enum 当成 object as const 的纯语法糖而不是生成新结构。
    liuw666
        5
    liuw666  
       3 天前 via iPhone
    字符串改起来费劲。用枚举和对象都行吧
    june4
        6
    june4  
    OP
       3 天前
    @liuw666 可是对象不受 ts 特殊加持对待,没有枚举完美。比如
    const Direction = {
    Up : 'up',
    Down: 'down',
    Left: 'left',
    Right: 'right',
    } as const
    type Direction = typeof Direction[keyof typeof Direction]

    你要用到 Direction 类型的时候,补全不象 enum 一样让你知道这里要填个 Direction.xxx ,而是直接是字符串 'up', 'down'之类的,很容易让人误用。
    jsq2627
        7
    jsq2627  
       3 天前
    感觉大多数开源库倾向用字符串
    Immortal
        8
    Immortal  
       3 天前
    typescript 自带的枚举都是不推荐用的,也会在将来废弃
    可以看看这个文章
    https://blog.disintegrator.dev/posts/ode-to-typescript-enums/
    lisongeee
        9
    lisongeee  
       3 天前
    # 6

    感觉用 Symbol 的欲望不是很高?
    chenliangngng
        10
    chenliangngng  
       3 天前
    我也有这个疑问,ts 对对象字面量和枚举支持不好,很难用,虽然 enum 不符合 ts 的初衷,但是转换成对象确实可以解决枚举的问题,否则所有枚举的地方都要声明两次
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1356 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:13 · PVG 01:13 · LAX 10:13 · JFK 13:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.