/* I have enum A & B at first */
enum A {
FOO = 'BAR',
GAR = 'ZAR'
}
enum B {
FOO = 'BAR'
}
/* Is there any way to retrieve something merged like this? */
enum Merged {
A_FOO = 'A_BAR',
A_GAR = 'A_ZAR',
B_FOO = 'B_BAR'
}
我有2个enum
,并且不能保证它们的键是互斥的。另外,我也想在合并之前对它们的值进行预处理。
我可以知道是否有任何方法可以实现这一目标?
答案 0 :(得分:1)
为此可以构造类型,但要到TS 4.1才能提供,template literal types。
在TS 4.1中,您可以定义一个辅助类型spec:
rules:
- host: gitlab.example.com
http:
paths:
- path: /
backend:
serviceName: gitlab
servicePort: 12080
,它具有神奇的作用:
Prefix
然后,很容易定义一个type Prefix<T extends { [K in keyof T]: string }, P extends string> = {
[K in keyof T & string as `${P}_${K}`]: `${P}_${T[K]}`
}
函数,该函数使用此类型来构造合并的枚举。
Merge
您可以在TypeScript playground上进行尝试,也可以在项目中安装function merged<
T1 extends { [K in keyof T1]: string }, P1 extends string,
T2 extends { [K in keyof T2]: string }, P2 extends string,
>(obj1: T1, prefix1: P1, obj2: T2, prefix2: P2): Prefix<T1, P1> & Prefix<T2, P2> {
const result = {} as any; // Going to have to cast somewhere anyways...
for (const [k, v] of Object.entries(obj1)) {
result[`${prefix1}_${k}`] = `${prefix1}_${v}`;
}
for (const [k, v] of Object.entries(obj2)) {
result[`${prefix2}_${k}`] = `${prefix2}_${v}`;
}
return result;
}
const Merged = merged(A, 'A', B, 'B')
console.log(Merged) // { A_FOO: "A_BAR", A_GAR: "A_ZAR", B_FOO: "B_BAR" }
。 TS 4.1计划于11月17日发布。