使用对象代替开关

2025-06-10

使用对象代替开关

有时,我们只需进行简单的重构就能实现很多功能!我将要展示的示例取自一个长期运行良好的真实项目。

但这并不意味着我们不应该仅仅因为已经取得了成效就主动改进!然而,我们也需要务实,避免陷入完美主义的陷阱。总而言之,我们应该找到一个平衡点,让必要的努力获得相应的回报。🕵️

我正在开发一个模块,它有一个getMonth函数可以根据给定的月份返回翻译键:



const getMonth = (month: string) => {
  let translationKey = ''
  switch (month) {
    case 'January':
      translationKey = 'JANUARY_TRANSLATION_KEY'
      break
    case 'February':
      translationKey = 'FEBRUARY_TRANSLATION_KEY'
      break
    case 'March':
      translationKey = 'MARCH_TRANSLATION_KEY'
      break
    case 'April':
      translationKey = 'APRIL_TRANSLATION_KEY'
      break
    case 'May':
      translationKey = 'MAY_TRANSLATION_KEY'
      break
    case 'June':
      translationKey = 'JUNE_TRANSLATION_KEY'
      break
    case 'July':
      translationKey = 'JULY_TRANSLATION_KEY'
      break
    case 'August':
      translationKey = 'AUGUST_TRANSLATION_KEY'
      break
    case 'September':
      translationKey = 'SEPTEMBER_TRANSLATION_KEY'
      break
    case 'October':
      translationKey = 'OCTOBER_TRANSLATION_KEY'
      break
    case 'November':
      translationKey = 'NOVEMBER_TRANSLATION_KEY'
      break
    case 'December':
      translationKey = 'DECEMBER_TRANSLATION_KEY'
  }
  return translationKey
}


Enter fullscreen mode Exit fullscreen mode

在这种情况下,我很清楚使用对象而不是 switch 语句可以实现什么目的:

为什么是对象?好吧,如果你仔细看看这个getMonth函数在做什么,你会发现它只是把键映射到值,这正是对象的作用!✨

因此,switch 语句完全没必要。实际上,它只会降低代码的可读性,并增加其认知复杂性。因此,重构后:



type Month =
  | 'January'
  | 'February'
  | 'March'
  | 'April'
  | 'May'
  | 'June'
  | 'July'
  | 'August'
  | 'September'
  | 'October'
  | 'November'
  | 'December'

type Mapping = Record<Month, string>

const MONTH_TO_TRANSLATION_KEY: Mapping = {
  January: 'JANUARY_TRANSLATION_KEY',
  February: 'FEBRUARY_TRANSLATION_KEY',
  March: 'MARCH_TRANSLATION_KEY',
  April: 'APRIL_TRANSLATION_KEY',
  May: 'MAY_TRANSLATION_KEY',
  June: 'JUNE_TRANSLATION_KEY',
  July: 'JULY_TRANSLATION_KEY',
  August: 'AUGUST_TRANSLATION_KEY',
  September: 'SEPTEMBER_TRANSLATION_KEY',
  October: 'OCTOBER_TRANSLATION_KEY',
  November: 'NOVEMBER_TRANSLATION_KEY',
  December: 'DECEMBER_TRANSLATION_KEY',
}

const getMonth = (month: Month) => MONTH_TO_TRANSLATION_KEY[month]


Enter fullscreen mode Exit fullscreen mode

我创建了一个包含两个版本的存储库,并使用了Cognitive-complexity-ts包来获取数字进行比较(分数越高表示代码越复杂):

该图显示 switch 版本的得分为 1,而 object 版本的得分为 0

正如预期的那样,对象的使用使得该代码不那么复杂,也更具可读性,因为它比 switch 语句更简洁。

tl;dr:每当我们注意到 switch 只是将键映射到值时,我们就应该使用对象。

鏂囩珷鏉ユ簮锛�https://dev.to/ubmit/use-an-object-instead-of-a-switch-1e55
PREV
如何使用 Strapi 构建 API
NEXT
每个 Web 开发人员都应该知道的 21 个热门 JavaScript 库