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

如何解决TypeScript简单对象的number类型索引签名报错问题

报错原因

你遇到的报错本质是TypeScript的类型校验规则导致:job.status的类型为通用number,而你定义的statuses对象仅包含1/2/3/4四个固定数字键,TS无法确定传入的number类型值一定落在合法键范围内,因此抛出索引签名不存在的错误。

可行解决方法

方法1:添加通用数字索引签名(快速适配)

直接声明对象可接受任意数字作为键,适合你确定job.status只会返回合法值的场景:

const statuses: Record<number, string> = {
  1: "Processing",
  2: "Done",
  3: "Aborted",
  4: "Queued",
}

方法2:收窄状态类型(类型安全最优)

先定义合法状态的联合类型,将job.status的类型从通用number收窄到指定枚举值,从根源上避免非法值传入:

// 定义合法状态枚举
type JobStatus = 1 | 2 | 3 | 4;

// 给Job类型的status字段指定上述类型
interface Job {
  // 其他job字段定义
  status: JobStatus;
}

const statuses: Record<JobStatus, string> = {
  1: "Processing",
  2: "Done",
  3: "Aborted",
  4: "Queued",
}

方法3:临时类型断言(快速修复)

不想修改全局类型定义时,可以直接在取值时断言key的类型:

{statuses[job.status as keyof typeof statuses]}

方法4:封装工具函数加兜底(鲁棒性最优)

封装独立的状态转文本函数,同时添加异常状态兜底,兼容后端返回非法值的场景:

const getJobStatusText = (status: number): string => {
  const statusMap = {
    1: "Processing",
    2: "Done",
    3: "Aborted",
    4: "Queued",
  } as const;
  return statusMap[status as keyof typeof statusMap] ?? "未知状态";
}

// UI中直接调用
{getJobStatusText(job.status)}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:27:00