You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS 14异步服务端组件应使用何种类型替代NextPage/FunctionComponent?

Next.js 14 异步服务端组件的类型替代方案

在Next.js 14的App Router模式下,异步服务端组件无法使用传统的NextPage或FunctionComponent类型——这两个类型要求组件返回同步的ReactElement,而异步组件返回的是Promise<JSX.Element>,因此会触发类型错误。以下是具体的替代方案:

1. 页面组件(Page Components)

对于App Router中的页面组件,无需显式标注类型,TypeScript会自动推断异步组件的类型。如果一定要手动指定类型,可以直接使用() => Promise<JSX.Element>:

// 推荐写法:自动推断类型
export default async function MyPage() {
  const userCredit = await getCredit(user.id);
  return <div>用户积分:{userCredit}</div>;
}

// 手动指定类型的写法
const MyPage: () => Promise<JSX.Element> = async () => {
  const userCredit = await getCredit(user.id);
  return <div>用户积分:{userCredit}</div>;
};
export default MyPage;

2. 自定义异步组件

对于自定义的异步服务端组件,可以自己定义一个异步组件类型,替代FunctionComponent:

// 定义通用异步组件类型
type AsyncFunctionComponent<P = {}> = (props: P) => Promise<JSX.Element>;

// 组件Props定义
type HeaderProps = {
  handleSidebarOpen: () => void;
};

// 使用自定义类型标注组件
export const Header: AsyncFunctionComponent<HeaderProps> = async ({ handleSidebarOpen }) => {
  const user = useUserSession();
  const userCredit = await getCredit(user.id);
  return (
    <header>
      <button onClick={handleSidebarOpen}>菜单</button>
      <span>当前积分:{userCredit}</span>
    </header>
  );
};

关键说明

  • NextPage是Pages Router时代的专属类型,App Router下的页面组件不再依赖该类型,异步页面直接用async function定义即可。
  • FunctionComponent(或React.FC)本质是同步组件类型,不支持返回Promise,因此必须用自定义的异步组件类型替代。

内容的提问来源于stack exchange,提问作者Robert Tirta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:01:11