You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:55:25