【问题标题】:how to destructure property if possibly undefined?如果可能未定义,如何解构属性?
【发布时间】:2022-10-24 16:00:12
【问题描述】:

我被困在构建时创建的这个 TS 错误上。有人有什么建议吗?

TypeError:无法解构“(中间值)”的属性“站点”,因为它未定义。

export default function Project({
  data,
  preview,
}: {
  data: any
  preview: any
}) {
  const { site, page } = data?.post

  return (
    <Layout site={site} page={page}>
      // Stuff
    </Layout>
  )
}

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

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

export async function getStaticPaths() {
  const paths = await sanityClient.fetch(projectSlugsQuery)
  return {
    paths: paths.map((slug) => ({ params: { slug } })),
    fallback: true,
  }
}

【问题讨论】:

    标签: reactjs typescript


    【解决方案1】:

    你不能解构它

    最好早点回来(在我看来),然后照常继续

    if (!data) {
      return null
    }
    
    const { site, page } = data.post;
    
    // Continue on
    ...
    

    【讨论】:

      【解决方案2】:

      如果post 不存在,data?.post 将返回undefined,因此您必须添加一个倒退目的。

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

      【讨论】:

        【解决方案3】:

        如果没有要解构的源,您就无法解构,但您可以通过空值合并使用默认值:

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

        您当前的dataany 类型,因此应该可以工作,但如果它具有正确的类型,您可能需要为sitepage 提供默认值。例如,如果 data 的类型为 {post: {site: string; page: number; }; }

        const { site = "something", page = 42 } = data?.post ?? {};
        // −−−−−−−−−^^^^^^^^^^^^^^−−−−−−^^^^^−−−−−−−−−−−−−−−^^^^^^
        

        【讨论】:

        • 你绝对是对的——我现在只是想要一个快速的肮脏解决方案,所以如果数据没有定义就返回
        • @BurgerSasha - 如果你能在你的情况下做到这一点,我也会这样做。 :-)
        猜你喜欢
        • 2022-08-23
        • 1970-01-01
        • 2019-07-06
        • 2018-06-14
        • 2021-05-10
        • 2020-08-08
        • 1970-01-01
        • 1970-01-01
        • 2012-02-22
        相关资源
        最近更新 更多