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

2021-09-15 14:09:04 +08:00
 Leviathann

目前想到的是用 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'
586 次点击
所在节点    问与答
3 条回复
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
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
2021-09-15 15:53:01 +08:00
用 obj 应该是比较理想的方法。

另外一种方法就是无限 extends ? 三元嵌套了,很难读。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/802020

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX