[求解答] 关于TS中enmu和type转换的黑魔法

100 阅读2分钟

前言:

写了一段时间的JS业务后,最近开始一个项目开始写TS;因为是从0开始的项目,所以希望摆脱原来AnyScript的写法,并且这次项目中的前端话语权还不错,可以设计一些数据结构。然后碰到了这样一个业务开发中的小问题,个人感觉应该很多同学都会碰到,希望大佬们不吝赐教

要实现的需求:

  1. 同时定义多个重复值的enum和type;
  2. 通过enum推导出type,或者通过type推导出enum;
同时保有重复值

enum:用于存储数据对应的枚举关系,保证提供的方法或者常量的取值统一;

type:用于值推导,辅助其他地方调用方法时的提示,降低代码出错率;

由此代码为

type TypeA = 'a' | 'b' | 'c';

enum EnumA {
  a='a',
  b='b',
  c='c'
}

const fn = (arg0:TypeA)=>EnumA.a === arg0;

fn('')

image.png

这样的写法可以正常支持保持重复值,而且可以有类型提示;但是,这样的写法在重复度很高,维护起来也更费力。

type TypeA = 'a' | 'b' | 'c';

enum EnumA {
  a='a',
  b='b',
  c='c'
}

type TypeB = 'x' | 'y' | 'z';

enum EnumA {
  x='x',
  y='y',
  z='z'
}

const fn = (arg0:TypeA,arg1:TypeB)=>EnumA.a === arg0 && EnumB.y;

fn('','')

image.png

通过enum推导type

搜索、咨询了一段时间后,发现TS确实没有什么合适的API可以满足enum和type转换的需求,难道就要放弃了吗?恰逢此时,有个大佬给我分享了一个「黑魔法」。直接上代码

type TypeA = 'a' | 'b' | 'c';

enum EnumA {
  a='a',
  b='b',
  c='c'
}

type EnumToTypeA = `${EnumA}`;

image.png

神奇的事情发生了,通过模版字符串的语法可以直接把enmu的value遍历出来,成为新的联合类型,完美符合我的需求,但是这是什么原因呢? 希望有大佬可以解答一下。(怕有什么副作用,或者隐藏的坑

最后分享一些黑魔法现场

遍历值测试,遍历的是value而不是key;

type TypeA = 'a' | 'b' | 'c';

enum EnumA {
  a,
  b,
  c
}

type EnumToTypeA = `${EnumA}`;

image.png

遍历拼接测试,所有的排列组合

type TypeA = 'a' | 'b' | 'c';

enum EnumA {
  a='a',
  b='b',
  c='c'
}

type TypeB = 'x' | 'y' | 'z';

enum EnumB {
  x='x',
  y='y',
  z='z'
}

type EnumToTypeA = `${EnumA}-${EnumB}`;

image.png