useReducer 예제를 보던 도중 switch case절 후에 문장 주위에 중괄호를 넣는 것을 알게되었습니다. 그다지 다르지 않고 넘어 지지 않도록 진술의 끝 break이나 return끝에서 여전히 필요 하지만 중괄호만에 좋은 장점이 있습니다.
중괄호는 블록 scope를 만들게 됩니다. 그 뜻은 각 case 마다 다른 블록 scope를 갖게되며, 다른 케이스에 있는 let, const 문법에 충돌나지 않고 고유한 범위의 변수를 정의 할 수 있게됩니다.
const initialState = { count: 0 }
function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      const afterCount = state.count + 1
      return { count: afterCount }
    case 'decrement':
      const afterCount = state.count - 1
      return { count: afterCount }
    default:
      throw new Error()
  }
}
function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState)
  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({ type: 'decrement' })}>-</button>
      <button onClick={() => dispatch({ type: 'increment' })}>+</button>
    </>
  )
}위 코드는 afterCount가 이미 선언되었다며 오류가 납니다. 왜냐하면 case문으로 나눴다 한들, 같은 reducer 스코프이기 때문입니다. 위 예제는 중괄호를 사용하여 해결할 수 있습니다.
const initialState = { count: 0 }
function reducer(state, action) {
  switch (action.type) {
    case 'increment': {
      const afterCount = state.count + 1
      return { count: afterCount }
    }
    case 'decrement': {
      const afterCount = state.count - 1
      return { count: afterCount }
    }
    default: {
      throw new Error()
    }
  }
}
function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState)
  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({ type: 'decrement' })}>-</button>
      <button onClick={() => dispatch({ type: 'increment' })}>+</button>
    </>
  )
}중괄호를 추가하여 각 case마다 블록 스코프 생성시켜 문제를 해결할 수 있게 됩니다.