[React Typescript] Strongly Typing Lazy Loaded Components with Generics

Navigating to the type definition for lazy by CMD + click in local VS Code, or in the DefinitelyTyped repo.

We can see the following definition:

function lazy<T extends ComponentType<any>>(
	factory: () => Promise<{ default: T }>
): LazyExoticComponent<T>;

 

ComponentType<Any>, is helper type to restrict the component must has the prop we passed in.

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

type Props<T extends ComponentType<any>> = {
  loader: () => Promise<{ default: T }>;
} & ComponentProps<T>;

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

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

<>
  <LazyLoad loader={() => import("fake-external-component")} id="123" />

  <LazyLoad
    loader={() => import("fake-external-component")}
    // @ts-expect-error number is not assignable to string
    id={123}
  />

  {/* @ts-expect-error id is missing! */}
  <LazyLoad loader={() => import("fake-external-component")} />
</>;

 

posted @   Zhentiw  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2020-08-28 [Postgres] Keep Data Integrity with Constraints
2020-08-28 [Postgres] Removing Data with SQL Delete, Truncate, and Drop
2020-08-28 [Postgres] Using uuid-ossp extenstion
2020-08-28 [Machine Learning] Simplified Cost Function and Gradient Descent
2019-08-28 [SCSS] SASS dynamic class properties
2018-08-28 [VueJS + Typescript] Decouple Dependencies Using IoC Containers in Vue with TypeScript and InversifyJS
2017-08-28 [D3] Creating a D3 Force Layout in React
点击右上角即可分享
微信分享提示