V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Leviathann
V2EX  ›  问与答

typescript 里,有没有可能直接把一个 union type 映射成另一个 union type?

  •  
  •   Leviathann · 2021-09-15 14:09:04 +08:00 · 645 次点击
    这是一个创建于 1176 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前想到的是用 obj 转一下

    type A = 'a' | 'b'
    
    type B = keyof {
      [key in keyof { [key in A]: any } as `mapped ${key}`]: any
    }
    // type B = 'mapped a' |  'mapped b'
    
    3 条回复    2021-09-15 15:53:01 +08:00
    rbe
        1
    rbe  
       2021-09-15 14:21:56 +08:00
    type A = 'a' | 'b'
    type B = `mapped ${A}`

    // type B => 'mapped a' | 'mapped b'
    ts 版本要大于 4.1
    Leviathann
        2
    Leviathann  
    OP
       2021-09-15 14:41:04 +08:00
    @rbe 我例子没举好,模板字符串类型是一个比较特殊的情况

    如果定义一个从下划线转驼峰的类型

    type CamelCase<S extends string> = S extends `${infer P1}_${infer P2}${infer P3}`
    ? `${Lowercase<P1>}${Uppercase<P2>}${CamelCase<P3>}`
    : Lowercase<S>

    type A = 'aa_bb' | 'bb_cc'
    要映射成
    type B = 'aaBb' | 'bbCc'
    namelosw
        3
    namelosw  
       2021-09-15 15:53:01 +08:00
    用 obj 应该是比较理想的方法。

    另外一种方法就是无限 extends ? 三元嵌套了,很难读。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5920 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 02:31 · PVG 10:31 · LAX 18:31 · JFK 21:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.