如何添加索引签名让字符串可作为TypeScript对象的索引属性?
问题原因
这个报错的核心原因是 current 字段被定义为了宽泛的string类型,TypeScript无法保证这个字符串一定是list对象上存在的合法键,因此用它作为索引取值时会触发隐式any的校验报错。
解决方案
方案1:调整类型定义(更推荐,从根源约束类型合法性)
首先限定current的取值范围只能是list的合法键,同时给list添加索引签名,代码修改如下:
// 先定义list允许的键的联合类型 type ListValidKey = 'itmesA' | 'itmesB' export interface StateInterface { list: { current: ListValidKey; // 不再用宽泛的string,限定current只能是两个合法键之一 itmesA: string[]; itmesB: string[]; // 添加索引签名,声明string类型的键对应的值类型 [key: string]: string[] | ListValidKey; }; }
修改完成后current天然就是合法的索引类型,你原来的取值代码let showItems = context.list[context.list.current][0];可以正常运行,不会再触发报错。
方案2:临时类型断言(适合快速修复场景)
如果不想改动原有接口定义,也可以在取值时添加类型断言,主动告诉TypeScript你确定current是list的合法键:
let showItems = context.list[context.list.current as keyof StateInterface['list']][0];
补充说明:你示例代码里的键名
itmesA、itmesB是拼写错误,正确拼写应为itemsA、itemsB,建议同步修正避免后续取值出错。
内容的提问来源于stack exchange,提问作者Richardson
相关产品推荐
相关产品推荐

