【问题标题】:Typescript - Merge two dynamically processed enum into oneTypescript - 将两个动态处理的枚举合并为一个
【发布时间】:2020-10-18 02:07:39
【问题描述】:
/* 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 个enums,我不能保证它们的密钥是互斥的。另外,我还想在合并之前对它们的值进行预处理。

请问有什么方法可以实现吗?

【问题讨论】:

    标签: typescript enums typescript-typings


    【解决方案1】:

    为此构造一个类型是可能的,但直到 TS 4.1,它给了我们template literal types

    在 TS 4.1 中,您可以定义一个帮助器类型 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 函数,该函数使用此类型构造一个合并的枚举。

    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" } 
    

    您可以在TypeScript playground 上试用此功能,或在您的项目中安装typescript@next。 TS 4.1 计划于 11 月 17 日发布。

    【讨论】:

    • 谢谢。我需要一天的时间才能理解。但是,我尝试将其修改为在没有合并功能的情况下使用,但不是运气?请问不使用辅助函数可以实现吗?
    • 你的意思是仅仅拥有类型并且神奇地给你另一个价值吗?你不能这样做......类型只是编译时间。
    猜你喜欢
    • 2021-10-10
    • 2018-07-06
    • 2023-02-17
    • 2023-03-31
    • 2021-10-21
    • 2014-05-31
    • 2019-03-21
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多