Декларативная работа с перечисляемыми типами через Record: как не городить switch или вложенные if

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Практически в любом проекте есть некая жесткая структура данных с перечислением (а чаще всего не одна), на которую нужно навешивать некие расширения: иконки в зависимости от типа или статуса некой сущности, логика поведения итд. Рассмотрим как это делают новички, и как можно делать красиво, используя служебный класс Record


В императивном подходе чаще всего используют "любимые" всеми switch или каскады из if:


  export type CarBodyType  = 'sedan' | 'universal' | 'minivan'

...

getCarBodyIcon(bodyType: CarBodyType): IconName {
  if (bodyType === 'sedan') return 'SEDAN_BODY'
  if (bodyType === 'universal') return 'UNIVERSAL_BODY'
  if (bodyType === 'minivan') return 'MINIVAN_BODY'
}

getCarBodyName(bodyType: CarBodyType) {
   switch (bodyType: CarBodyType) {
       case 'sedan': return 'Седан';
       case 'universal': return 'Универсал';
       case 'minivan': return 'Минивэн';
    }
}

То же самое в декларативном стиле:


export type TCarBody  = 'sedan' | 'universal' | 'minivan'

export interface ICarViewExtension { name: string, icon: IconName }

export const CAR_BODY_VIEW_RECORD: Record<TCarBody, ICarViewExtension> {
    sedan: { name: 'Седан', icon: 'SEDAN_BODY'},
    universal: { name: 'Универсал', icon: 'UNIVERSAL_BODY'},
    minivan: { name: 'Минивэн', icon: 'MINIVAN_BODY'},
}

...

getCarBodyIcon(bodyType: TCarBody): IconName {
  return CAR_BODY_VIEW_RECORD[bodyType].icon;
}

getCarBodyName(bodyType: TCarBody) {
   return CAR_BODY_VIEW_RECORD[bodyType].name;
}

Само собой, функции getCarBodyIcon и getCarBodyName тут для упрощения, лучше пользоваться пайпами.
Что мы получаем от использования рекордов?


  1. WebStorm будет сразу давать подсказки, если мы, например, добавили новый тип кузова в TCarBody и забыли его прописать в рекорд. С if и switch такого не будет.
  2. Код получается более читаемый, да и собственно кода получается меньше
  3. Если вдруг захочется сделать типы кузова настраиваемыми на сервере где-нибудь в админке, и хронить иконки, названия, итд в базе данных, потребуется гораздо меньше правок. Так как логика гибкая, а источник истины — один, и он в виде структуры данных, которую можно передать в json и распарсить.

Как всегда жду мнение сообщества и приветствую конструктивную критику.

Источник: https://habr.com/ru/post/520876/


Интересные статьи

Интересные статьи

Привет! Меня зовут Седов Фёдор, я ученик 11 класса и выпускник «IT Школы Samsung» 2020 года. Мне предложили рассказать о своём опыте разработки мобильного приложения, мое...
В 2019 году люди знакомятся с брендом, выбирают и, что самое главное, ПОКУПАЮТ через интернет. Сегодня практически у любого бизнеса есть свой сайт — от личных блогов, зарабатывающих на рекламе, до инт...
В одном банке внедрили новую систему для рабочих мест операторов. Это для нас любой новый интерфейс — простой. А у некоторых людей даже сдвиг кнопки вызывает панику. Тут же новым было всё. В итог...
Google недавно выпустила в публичный доступ новую версию Google Analytics под названием App + Web. Симо Ахава уже написал отличную пошаговую инструкцию о том, как начать работать с инструментом, ...
В начале 2010-х годов объединенная группа специалистов из Стенфордского университета, Массачусетского университета, The Tor Project и SRI International представила результаты своего исследова...