如何解决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
相关产品推荐
相关产品推荐

