Implementing UnknownAction Type Safety

Show how to define an UnknownAction type and use it in a Redux reducer to ensure type safety.
// Define UnknownAction type
interface UnknownAction {
    type: unknown;
    [extraProps: string]: unknown;
This piece of code defines the UnknownAction type, which has a 'type' property of unknown type, meaning it can be any type, and an index signature to handle any additional properties.
// Define known action types
interface IncrementAction {
    type: 'INCREMENT';

interface DecrementAction {
    type: 'DECREMENT';
Here, we define the known action types for increment and decrement with a specific 'type' property.
// Redux reducer with UnknownAction type safety
function counterReducer(state = 0, action: UnknownAction | IncrementAction | DecrementAction) {
    switch (action.type) {
        case 'INCREMENT':
            // Narrow down the type to IncrementAction
            return state + 1;
        case 'DECREMENT':
            // Narrow down the type to DecrementAction
            return state - 1;
            // Ensure the default case returns the unmodified state
            return state;
The reducer is enhanced with type safety by accepting both UnknownAction and known action types. The switch statement handles known actions and returns the unmodified state for unknown actions.