Refactoring to Use Redux v5.0.0 Slices

Outline the refactoring process of a traditional Redux reducer into a slice using Redux Toolkit and Redux v5.0.0, with focus on typing and action creators.
import { createSlice } from '@reduxjs/toolkit';

// Define a type for the slice state
interface CounterState {
  value: number;

// Define the initial state using that type
const initialState: CounterState = {
  value: 0,

export const counterSlice = createSlice({
  name: 'counter',
  reducers: {
    increment: state => {
      // Redux Toolkit allows us to write 'mutating' logic in reducers. It
      // doesn't actually mutate the state because it uses the Immer library,
      // which detects changes to a 'draft state' and produces a brand new
      // immutable state based off those changes
      state.value += 1;
    decrement: state => {
      state.value -= 1;
    incrementByAmount: (state, action: PayloadAction<number>) => {
      state.value += action.payload;

// Action creators are generated for each case reducer function
export const { increment, decrement, incrementByAmount } = counterSlice.actions;

export default counterSlice.reducer;
This code snippet is a refactoring of a traditional Redux reducer into a Redux Toolkit slice for a simple counter application. The createSlice function is used to define the slice name, the initial state, and three reducers: increment, decrement, and incrementByAmount. The CounterState interface ensures type safety for the state. Action creators are automatically generated for each reducer.