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

TypeScript报错:prevUrl属性缺失及类型不存在问题如何修复?

修复NavigationButtons组件的TypeScript类型校验问题

为啥会报错?

你写的代码里,虽然通过variant的条件判断已经确保只有在middle或last模式下才会访问prevUrl,但TypeScript没法通过剩余参数...props自动缩小类型范围——因为...props被推断成了三个联合类型的交集(也就是空对象{}),所以它不认props.prevUrl的存在,就抛出了错误。

怎么修复?

方案1:直接用完整props(推荐)

别用...props剩余参数,直接使用传入的完整props对象。这样TypeScript能通过variant的条件判断自动窄化类型,确认在对应分支下prevUrl一定存在:

function NavigationButtons(props:
  | { variant: 'first'; nextUrl: string }
  | { variant: 'middle'; prevUrl: string; nextUrl: string }
  | { variant: 'last'; prevUrl: string; confirm: () => void }) {
  const { variant } = props;

  return (
    <nav
      className={`fixed bottom-0 left-0 right-0 flex bg-neutral-white p-4 ${
        variant === 'first' && 'justify-end'
      } lg:static lg:mt-auto`}
    >
      {(variant === 'middle' || variant === 'last') && (
        <Link href={props.prevUrl}>
          <button>Go Back</button>
        </Link>
      )}
      {(variant === 'first' || variant === 'middle') && (
        <button className='rounded bg-primary-marine-blue px-4 py-2 text-neutral-alabaster'>
          Next Step
        </button>
      )}
      {variant === 'last' && <button>Confirm</button>}
    </nav>
  );
}

要是想让代码更清晰,可以改成switch分支,每个分支里解构对应属性:

function NavigationButtons(props:
  | { variant: 'first'; nextUrl: string }
  | { variant: 'middle'; prevUrl: string; nextUrl: string }
  | { variant: 'last'; prevUrl: string; confirm: () => void }) {
  switch (props.variant) {
    case 'first':
      return (
        <nav className="fixed bottom-0 left-0 right-0 flex bg-neutral-white p-4 justify-end lg:static lg:mt-auto">
          <button className='rounded bg-primary-marine-blue px-4 py-2 text-neutral-alabaster'>
            Next Step
          </button>
        </nav>
      );
    case 'middle':
      const { prevUrl: middlePrev } = props;
      return (
        <nav className="fixed bottom-0 left-0 right-0 flex bg-neutral-white p-4 lg:static lg:mt-auto">
          <Link href={middlePrev}>
            <button>Go Back</button>
          </Link>
          <button className='rounded bg-primary-marine-blue px-4 py-2 text-neutral-alabaster'>
            Next Step
          </button>
        </nav>
      );
    case 'last':
      const { prevUrl: lastPrev, confirm } = props;
      return (
        <nav className="fixed bottom-0 left-0 right-0 flex bg-neutral-white p-4 lg:static lg:mt-auto">
          <Link href={lastPrev}>
            <button>Go Back</button>
          </Link>
          <button onClick={confirm}>Confirm</button>
        </nav>
      );
  }
}

方案2:类型断言(快速但不够严谨)

如果不想大改代码结构,也可以在访问prevUrl时用类型断言告诉TypeScript这个属性此时肯定存在:

{(variant === 'middle' || variant === 'last') && (
  <Link href={props.prevUrl as string}>
    <button>Go Back</button>
  </Link>
)}

这种方式简单,但如果后续修改条件判断,可能会引入运行时错误,所以更推荐第一种方案。

内容的提问来源于stack exchange,提问作者Denys Zakharkevych

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:40:13