如何用Object Literals改写TypeScript中的switch-case颜色处理函数?
用对象字面量重构TypeScript颜色处理函数
直接上重构后的代码,完全替代原有的switch-case结构:
static darkerColors(value: string, theme: ThemeMode) { // 定义颜色映射表:key对应Colors枚举值,value是[亮主题颜色, 暗主题颜色] const colorMap: Record<string, [string, string]> = { [Colors.BLUE]: ['#253F82', '#BED1FF'], [Colors.CYAN]: ['#066262', '#A2EAEA'], [Colors.PURPLE]: ['#4727B0', '#D3C6FD'], [Colors.ORANGE]: ['#9C2100', '#FF9377'], [Colors.YELLOW]: ['#6C5200', '#F9E298'] }; // 获取当前颜色对应的颜色对,无匹配时用通用默认色 const [lightColor, darkColor] = colorMap[value] || ['#32363B', '#C9CED4']; // 根据主题返回对应颜色 return theme === ThemeMode.LIGHT ? lightColor : darkColor; }
重构思路说明
- 颜色映射表:用
Record<string, [string, string]>定义类型,确保每个键对应一组亮/暗主题颜色,后续新增或修改颜色直接在对象中添加/调整键值对即可,比修改switch-case分支更直观高效。 - 默认值处理:通过
colorMap[value] || 默认值的方式,直接替代原switch的default分支,逻辑简洁且易读。 - 精简变量:去掉原函数中
test中间变量,将主题判断逻辑直接整合到返回语句中,减少冗余代码。
如果要进一步提升TypeScript类型安全性,可以给value参数指定更精确的类型,避免传入无效颜色值:
static darkerColors(value: keyof typeof Colors, theme: ThemeMode) { const colorMap: Record<keyof typeof Colors, [string, string]> = { [Colors.BLUE]: ['#253F82', '#BED1FF'], [Colors.CYAN]: ['#066262', '#A2EAEA'], [Colors.PURPLE]: ['#4727B0', '#D3C6FD'], [Colors.ORANGE]: ['#9C2100', '#FF9377'], [Colors.YELLOW]: ['#6C5200', '#F9E298'] }; // 因value为Colors枚举的键,colorMap[value]必然存在,若后续枚举新增值,此处会触发类型报错,可按需保留默认值 const [lightColor, darkColor] = colorMap[value] || ['#32363B', '#C9CED4']; return theme === ThemeMode.LIGHT ? lightColor : darkColor; }
这种写法既精简了代码结构,又提升了可维护性——后续调整颜色逻辑无需改动分支判断,仅需修改映射表即可。
内容的提问来源于stack exchange,提问作者Giuseppe Fantoni
相关产品推荐
相关产品推荐

