[Эта краткая статья является выдержкой из документов Акта]

Многих людей отталкивает использование switch в редьюсерах:

Хотя это эстетическое суждение и в нем нет ничего плохого, есть и более идиоматические способы.

Во-первых, оператор switch — это бедные родственники сопоставления с образцом и
охранников
:

Это было бы эквивалентно нашему предыдущему примеру на Haskell. Конечно, мы можем улучшить это, используя возможности Haskell, особенно, я бы сказал, правильные типы вместо строк для типов действий (теперь вы, вероятно, лучше понимаете, почему это называется тип в JS :D), но хорошая новость заключается в том, что в Ramda есть интересная функция, позволяющая немного приблизиться к этому, а именно cond ( я полагаю, что она вдохновлена ​​cond из ClojureScript).

Вот суть cond:

Таким образом, если значение, переданное функции, равно нулю, она запускает первую функцию
и так далее, пока не дойдет до конечного условия T, которое в основном является истинной функцией, т. е. функция, которая всегда возвращает true (например, () =› true), поэтому
она всегда соответствует любому несовпадающему значению, работая почти так же, как Haskell
иначе или по умолчанию в JS, или :else в cljs, или…

Таким образом, еще один идиоматический — в функциональном контексте — способ создания редуктора — это прибегнуть к этому хелперу:

Хотя это более компонуемо, чем переключатель, поскольку вы можете добавлять элементы в список динамически и более идиоматично с функциональной точки зрения, оно кажется все еще слишком многословным и не совсем идиоматическим в контексте JavaScript (который, я думаю, трудно определить… вероятно, идиоматично JavaScript — это либо jQuery, либо
внедрение логики в виде атрибутов тега :D).

Итак, глядя на cond и его конкретное использование в редукторах, кажется, что наиболее распространенным вариантом использования является использование equals в условии (за исключением T), и
всегда функция с аргументами редуктора в качестве второго параметра. Поэтому естественно предположить, что мы могли бы реализовать что-то поверх этого, чтобы в итоге получить такую ​​конфигурацию:

Мы также могли бы удалить действие, передаваемое функции (то, что всегда будет делать cond), обернув его, и иметь условие T как по умолчанию.

Это немного синтаксического сахара по сравнению с cond Ramda. Вот полный пример:

Гораздо лаконичнее.

Вы найдете что-то очень похожее в мире Redux в redux-actions
handleActions.

Но все же, если мы заглянем в утилиты Ramda, то найдем функции с точно такими же сигнатурами, которые нам здесь нужны, а именно Number → Number
→ Number
(получает два числа, возвращает число). Например,
сложить, вычесть, умножить и разделить .

Поэтому мы можем сделать:

И, наконец, это то же самое, что:

И последнее замечание: вам может быть интересно, каковы преимущества реализации этого поверх , а не более «традиционного» (в мире JS) способа, как это делают другие библиотеки. Например, если вам нужны
более сложные условия, вы все равно можете добиться этого, используя массивы вместо объекта:

И, как видите, использование объектива Ramda делает все намного лучше.

Если интересно, вот реализация и несколько примеров использования.