React.lazy supercharged

Aug 21, 2025

Very simple and powerful component to lazy load various components with different props.

This component takes in a loader prop, which allows it to import a component from the outside. Then it sticks that component in a useMemo, loads it with React.lazy, and renders that component with a Suspense boundary wrapping it. The component that we're working with is an imported fake-external-component that takes in a props.id and returns a simple divwith "hello" inside. We currently have some errors because the props are not typed correctly


import { lazy, Suspense, useMemo } from "react";

type Props = {
  loader: unknown;
};

/**
 * 1. This component is supposed to take a loader function that returns a
 * component, and render that component when it's loaded.
 *
 * But it's not typed correctly, and it's not generic enough.
 */
function LazyLoad({ loader, ...props }: Props) {
  const LazyComponent = useMemo(() => lazy(loader), [loader]);

  return (
    <Suspense fallback={"Loading..."}>
      <LazyComponent {...props} />
    </Suspense>
  );
}

LazyLoad is going to receive different props, so we need to make it generic. In this case, the part that needs to be dynamic is theComponentTypethat we're passing in.

import { lazy, Suspense } from 'react';

type LazyComponentProps<Component extends React.ComponentType<any>> = {
	loader: () => Promise<{ default: Component }>;
} & React.ComponentProps<Component>;

function LazyLoad<C extends React.ComponentType<any>>({
  loader,
  ...props
}: LazyComponentProps<C>) {
  const LazyComponent = useMemo(() => lazy(loader), [loader]);

  return (
    <Suspense fallback={"Loading..."}>
      <LazyComponent {...props} />
    </Suspense>
  );
}