[Angular, TypeScript] Декларативная работа с перечисляемыми типами через Record: как не городить switch или вложенные if
Автор
Сообщение
news_bot ®
Стаж: 6 лет 8 месяцев
Сообщений: 27286
Практически в любом проекте есть некая жесткая структура данных с перечислением (а чаще всего не одна), на которую нужно навешивать некие расширения: иконки в зависимости от типа или статуса некой сущности, логика поведения итд. Рассмотрим как это делают новички, и как можно делать красиво, используя служебный класс 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 тут для упрощения, лучше пользоваться пайпами.
Что мы получаем от использования рекордов?
- WebStorm будет сразу давать подсказки, если мы, например, добавили новый тип кузова в TCarBody и забыли его прописать в рекорд. С if и switch такого не будет.
- Код получается более читаемый, да и собственно кода получается меньше
- Если вдруг захочется сделать типы кузова настраиваемыми на сервере где-нибудь в админке, и хронить иконки, названия, итд в базе данных, потребуется гораздо меньше правок. Так как логика гибкая, а источник истины — один, и он в виде структуры данных, которую можно передать в json и распарсить.
Как всегда жду мнение сообщества и приветствую конструктивную критику.
===========
Источник:
habr.com
===========
Похожие новости:
- [API, Конференции] Приглашение на онлайн-конференцию по иннерсорсу Сбера — 23 декабря
- [CSS, JavaScript, IT-инфраструктура, HTML] Больше, больше фронтенда — доклады c ЮMoneyDay
- [Платежные системы, Анализ и проектирование систем, Бизнес-модели, IT-компании] Архитектура экосистем
- [JavaScript, Программирование, Node.JS] Дино (Deno): Создать API для отдыха с помощью JWT (перевод)
- [Java, Управление разработкой, Микросервисы] Внести массовые изменения в микросервисы, автоматизировать код-ревью и сберечь нервы команде
- [JavaScript, Программирование, TypeScript] Кастомизация компонентов Ant Design и оптимизация бандла
- [JavaScript, Node.JS, TypeScript] Оптимизация трафика при синхронизация состояний через Jsonpatch
- [Децентрализованные сети, Анализ и проектирование систем, Беспроводные технологии, Mesh-сети, Разработка для интернета вещей] Концепция независимой инфраструктуры для IIoT системы на основе mesh cети
- [JavaScript, Интерфейсы, ReactJS, TypeScript] Использование Effector в стеке React + TypeScript
- [Разработка под e-commerce, Управление e-commerce, Бизнес-модели] Бэк-офис маркетплейса: все, что за витриной
Теги для поиска: #_angular, #_typescript, #_arhitektura (архитектура), #_angular, #_typescript
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 01-Ноя 04:40
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 8 месяцев |
|
Практически в любом проекте есть некая жесткая структура данных с перечислением (а чаще всего не одна), на которую нужно навешивать некие расширения: иконки в зависимости от типа или статуса некой сущности, логика поведения итд. Рассмотрим как это делают новички, и как можно делать красиво, используя служебный класс 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 тут для упрощения, лучше пользоваться пайпами. Что мы получаем от использования рекордов?
Как всегда жду мнение сообщества и приветствую конструктивную критику. =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 01-Ноя 04:40
Часовой пояс: UTC + 5