Reduxで利用する定数を楽に書く

Redux を使った実装をしていると、 action.typeを下記のように定数で宣言し、

export const ADD_TODO = 'ADD_TODO';
export const TOGGLE_TODO = 'TOGGLE_TODO';
export const SET_VISIBILITY_FILTER = 'SET_VISIBILITY_FILTER';

reducers, actionsなどでは以下のようにimportする実装がよく書かれていると思うのですが
( Redux のドキュメントでもこのような実装だった )

import { ADD_TODO, TOGGLE_TODO, SET_VISIBILITY_FILTER } from './actions'

宣言するaction.typeが増えた場合に、
定数の宣言に不自由さを感じたので、
定数を作るための関数を用意しました。

export function createConstants(...constants) {
  return constants.reduce((accumulator, constant) => {
    accumulator[constant] = constant;
    return accumulator;
  }, {});
}

定数の宣言はこの関数を使うと下記のようになります。

import { createConstants } from '../utils';

export default createConstants(
  'ADD_TODO',
  'TOGGLE_TODO',
  'SET_VISIBILITY_FILTER',
);

reducers, actionsでは下記のようにimportすることで、シンプルに定数を扱うことができます。

import C from '../constans';

switch (action.type) {
  case C.ADD_TODO:
  ...
}

ちなみに、createConstants関数はeslint-confing-airbnbにあてると、 no-param-reassign

Assignment to property of function parameter 'accumulator'

とerrorになるので、.eslintrcに下記を追加して、errorを避けています。

"rules": {
   "no-param-reassign": [2, {
     "props": false
   }]
 }