前言:
写了一段时间的JS业务后,最近开始一个项目开始写TS;因为是从0开始的项目,所以希望摆脱原来AnyScript的写法,并且这次项目中的前端话语权还不错,可以设计一些数据结构。然后碰到了这样一个业务开发中的小问题,个人感觉应该很多同学都会碰到,希望大佬们不吝赐教
要实现的需求:
- 同时定义多个重复值的enum和type;
- 通过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('')
这样的写法可以正常支持保持重复值,而且可以有类型提示;但是,这样的写法在重复度很高,维护起来也更费力。
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('','')
通过enum推导type
搜索、咨询了一段时间后,发现TS确实没有什么合适的API可以满足enum和type转换的需求,难道就要放弃了吗?恰逢此时,有个大佬给我分享了一个「黑魔法」。直接上代码
type TypeA = 'a' | 'b' | 'c';
enum EnumA {
a='a',
b='b',
c='c'
}
type EnumToTypeA = `${EnumA}`;
神奇的事情发生了,通过模版字符串的语法可以直接把enmu的value遍历出来,成为新的联合类型,完美符合我的需求,但是这是什么原因呢? 希望有大佬可以解答一下。(怕有什么副作用,或者隐藏的坑
最后分享一些黑魔法现场
遍历值测试,遍历的是value而不是key;
type TypeA = 'a' | 'b' | 'c';
enum EnumA {
a,
b,
c
}
type EnumToTypeA = `${EnumA}`;
遍历拼接测试,所有的排列组合
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}`;