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

Next.js+TypeScript传数组报错:string[]无法赋值给query类型

Next.js 页面间传递字符串数组的解决方案

报错原因

Next.js 的 <Link> 组件中,query 参数要求为 ParsedUrlQueryInput 类型(即键值对结构),直接传递字符串数组不符合类型定义,因此 TypeScript 抛出类型不匹配错误。

可行方案

1. 将数组转为字符串传递(推荐)

这种方式适配 URL 传参逻辑,页面刷新后数据不会丢失,适合非敏感数据传递:

  • 传递端代码:
    <Link href={{ 
      pathname: "/model", 
      query: { data: JSON.stringify(data) } 
    }}>
      跳转至模型页
    </Link>
    
  • 接收端代码:
    import { useRouter } from 'next/router';
    
    export default function ModelPage() {
      const router = useRouter();
      // 处理可能的空值或解析错误
      const data = router.query.data 
        ? JSON.parse(router.query.data as string) 
        : [];
    
      return <div>{/* 使用 data */}</div>;
    }
    

2. 使用 URL 多参数格式传递

如果数组元素都是简单字符串,可以直接将数组作为 query 的一个字段,Next.js 会自动生成 ?items=item1&items=item2 格式的 URL:

  • 传递端代码:
    <Link href={{ 
      pathname: "/model", 
      query: { items: data } 
    }}>
      跳转至模型页
    </Link>
    
  • 接收端代码:
    import { useRouter } from 'next/router';
    
    export default function ModelPage() {
      const router = useRouter();
      // 处理单个值/多个值的类型差异
      const items = Array.isArray(router.query.items) 
        ? router.query.items 
        : (router.query.items ? [router.query.items] : []);
    
      return <div>{/* 使用 items */}</div>;
    }
    

3. 不推荐使用 useContext 的原因

useContext 是用于全局跨组件共享状态的方案,而你的需求只是页面跳转时一次性传递数据,使用它会造成过度设计:

  • 上下文需要在 _app.tsx 中全局包裹,增加不必要的复杂度
  • 页面刷新后,上下文存储的数据会丢失(仅存在内存中)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:37:34