TypeScript报错:string[]/(string|undefined)[]不能作为索引类型,JS为何可行?
咱们先拆解下你这段代码的核心问题:你用obj.values.map(i => i.object_id)得到的key是一个数组类型(string[]或者(string | undefined)[]),但TypeScript对对象的索引类型有严格的规则限制,这就是报错的根本原因。
具体错误原因分析:
错误1:Type 'string[]' cannot be used as an index type
在JavaScript里,把数组当作对象的键时,JS会自动把数组转成字符串(比如['a','b']会被隐式转为"a,b"),所以代码能正常运行。但TypeScript不允许这种操作——它明确规定对象的索引只能是string、number或symbol类型,数组不属于合法的索引类型范畴,直接用string[]当键就会触发类型检查错误。错误2:Type '(string | undefined)[]' cannot be used as an index type
这个错误是第一个错误的延伸:如果obj.values里的i.object_id可能是undefined(比如某些对象的object_id未赋值),那map返回的数组就会混入undefined,类型变成(string | undefined)[]。这种包含undefined的混合类型数组,同样不符合TypeScript的索引类型规则,自然也会报错。
快速修复思路
如果你想保留原逻辑(把数组关联的内容聚合),可以把数组转成字符串作为键,比如用join方法:
// 如果object_id可能为undefined,先处理掉空值 let key = obj.values.map(i => i.object_id ?? '').join(',');
这样key的类型就变成了合法的string,就能顺利通过TypeScript的类型检查了。
内容的提问来源于stack exchange,提问作者Andrey Luzin

