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

React TypeScript报错:‘string’类型无法用于对象索引

React中useParams结合JSON数据索引的TypeScript类型问题解决

场景说明

我有一个DetailPage组件,以及名为data.json的JSON数据,数据结构示例如下:

data = {
  mobile: [...someData], speaker:[...someData],
  // 其他分类字段
}

尝试用useParams Hook获取路由参数,将其作为对象键访问数据,代码如下:

import data from "../data/data.json";

const DetailPage = () => {
  const { category, id } = useParams();
  return <h1>{data[category][id].title}</h1>;
};
export default DetailPage;

遇到的错误

第一个错误:

Type 'undefined' cannot be used as an index type.

我已通过添加类型守卫解决该问题:

<h1>{category !== undefined && data[category][id].title}</h1>

但无法处理第二个错误:

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type

解决方案

方案1:定义完整数据类型(推荐)

通过TypeScript类型别名明确限定数据结构,让TS能识别合法的分类键:

// 定义单条数据的类型
type Item = {
  title: string;
  // 根据实际数据补充其他字段
};

// 定义整个data的结构,列出所有允许的分类键
type DataStructure = {
  mobile: Item[];
  speaker: Item[];
  // 补充其他分类
};

// 导入数据并指定类型
import rawData from "../data/data.json";
const data = rawData as DataStructure;

修改组件代码,同时处理id的类型转换与合法性校验:

const DetailPage = () => {
  const { category, id } = useParams();
  
  // 校验参数合法性
  if (!category || !(category in data) || isNaN(Number(id))) {
    return <h1>无效的分类或ID</h1>;
  }

  // 安全访问数据
  const targetItem = data[category as keyof DataStructure][Number(id)];
  return <h1>{targetItem.title}</h1>;
};

方案2:快速类型断言(适合简单场景)

若不想编写完整类型定义,可直接对category做类型断言,告诉TS它是data的合法键:

const DetailPage = () => {
  const { category, id } = useParams();
  
  if (!category || !(category in data) || isNaN(Number(id))) {
    return <h1>无效的分类或ID</h1>;
  }

  // 断言category为data的键类型
  const targetItem = data[category as keyof typeof data][Number(id)];
  return <h1>{targetItem.title}</h1>;
};

关键说明

  • 路由参数category和id默认类型为string | undefined,必须做存在性校验
  • 需将id转为数字类型,因为数组索引为数字,而路由参数是字符串
  • 完整类型定义能提前发现潜在的键名拼写错误,提升代码健壮性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:05:22