Typescript-将两个经过动态处理的枚举合并为一个

时间:2020-10-18 02:07:39

标签: typescript enums typescript-typings

/* 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,并且不能保证它们的键是互斥的。另外,我也想在合并之前对它们的值进行预处理。

我可以知道是否有任何方法可以实现这一目标?

1 个答案:

答案 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日发布。