Using TypeScript with Redux Middlewares

Provide an example of using Redux middleware in a TypeScript project, focusing on type-safe way of handling actions and state within middleware functions.
import { Middleware, Dispatch } from 'redux';

// Define a custom Action type with a strict shape
interface MyAction {
    type: string;
    payload?: any;

// Define the State shape for type safety
interface State {
    // ... State definition ...

// Create a custom middleware using TypeScript generics
const myMiddleware: Middleware<{}, State, Dispatch<MyAction>> = store => next => action => {
    // Your middleware logic goes here
    console.log('Dispatching:', action);
    // Proceed with the next action
    return next(action);

export default myMiddleware;
This TypeScript example defines a custom redux middleware that is type-safe. It specifies the shape of the action and the state. In the middleware function, it logs the action being dispatched and then continues to the next middleware or reducer by calling `next(action)`.
import { applyMiddleware, createStore } from 'redux';
import myMiddleware from './myMiddleware';

// Reducer function with initialState and Action types
const reducer = (state: State = initialState, action: MyAction) => {
    // Handle actions
    switch (action.type) {
        // ... case handlers ...
            return state;

// Create the Redux store and apply the custom middleware
const store = createStore(reducer, applyMiddleware(myMiddleware));

export default store;
This section of code demonstrates how to create a Redux store using the `createStore` function from redux, by applying the custom middleware defined earlier. It also includes a placeholder reducer function where you would handle your actions. The `State` and `MyAction` types ensure that the reducer and middleware are type-safe.