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

如何解构可能为undefined的属性?解决TS构建报错问题

解决TypeScript解构undefined属性的报错问题

报错TypeError: Cannot destructure property 'site' of '(intermediate value)' as it is undefined的核心原因是data?.post可能为undefined,直接解构其属性会触发错误。以下是几种可行的解决方式:

1. 给解构目标设置默认空对象

通过空值合并运算符(??)或逻辑或(||)给data?.post设置默认空对象,确保解构操作始终有合法的目标:

const { site, page } = data?.post ?? {};

或:

const { site, page } = data?.post || {};

这样即使data.post是undefined,解构出的site和page会是undefined,不会抛出错误。

2. 提前校验post存在性再渲染

在渲染Layout组件前,先检查data.post是否存在,不存在时返回加载状态或错误提示:

export default function Project({ data, preview }) {
  if (!data?.post) {
    return <div>内容加载中或不存在</div>;
  }
  const { site, page } = data.post;
  return (
    <Layout site={site} page={page}>
      {/* 页面内容 */}
    </Layout>
  );
}

3. 优化TypeScript类型定义,避免any

替换any类型为具体的接口定义,让TypeScript在编译阶段提前发现潜在问题:

// 定义具体的类型
interface Site {
  // 填写Site的属性,比如name: string; 等
}

interface Page {
  // 填写Page的属性
}

interface ProjectData {
  post?: {
    site?: Site;
    page?: Page;
  };
  morePosts: Array<any>; // 替换为morePosts的具体类型
}

interface ProjectProps {
  data: ProjectData;
  preview: boolean;
}

export default function Project({ data, preview }: ProjectProps) {
  const { site, page } = data?.post ?? {};
  return <Layout site={site} page={page}>...</Layout>;
}

4. 完善getStaticProps的数据校验

由于getStaticPaths设置了fallback: true,访问未预渲染的路径时可能获取不到post数据。在getStaticProps中校验post是否存在,不存在则返回404:

export async function getStaticProps({ params, preview = false }) {
  const { post, morePosts } = await getClient(preview).fetch(projectQuery, {
    slug: params.slug,
  });

  // 若post不存在,返回404
  if (!post) {
    return { notFound: true };
  }

  return {
    props: {
      preview,
      data: {
        post,
        morePosts: overlayDrafts(morePosts),
      },
    },
  };
}

内容的提问来源于stack exchange,提问作者Burger Sasha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:25:37