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

TypeScript报错:类型上未找到string参数的索引签名如何解决

错误原因

Object.keys() 方法默认返回的是 string[] 类型的数组,而你定义的 MyType 只有固定的三个字面量键 'high' | 'low' | 'medium',TS不允许用宽泛的string类型去索引只有明确有限键的类型,因此抛出了该错误。


解决方法

方案1:临时类型断言(最简单快捷)

直接在使用item索引data时,把item断言为keyof MyType即可,修改代码如下:

{Object.keys(data)          
         .map((item: string, key: number) => {
            return (
              data &&
              data[item as keyof MyType]?.preview && (
                < component here >
              )
            );
          })}

如果确定data的键就是MyType的所有键,也可以直接对Object.keys的返回值做整体断言:

{(Object.keys(data) as Array<keyof MyType>)          
         .map((item, key) => {
            return (
              data[item]?.preview && (
                < component here >
              )
            );
          })}

方案2:封装类型安全的keys工具函数(可复用,推荐)

如果你经常需要做这类遍历,可以封装一个泛型工具函数,让它直接返回对应类型的键数组,不需要每次手动断言:

// 全局通用的类型安全keys函数
function getObjectKeys<T extends object>(obj: T) {
  return Object.keys(obj) as Array<keyof T>
}

// 业务代码中使用
{getObjectKeys(data)          
         .map((item, key) => {
            return (
              data[item]?.preview && (
                < component here >
              )
            );
          })}

方案3:给MyType添加索引签名(非必要不推荐)

如果你的业务场景中MyType确实需要支持任意字符串作为键,可以给类型添加索引签名,从根源解决索引报错,但该方案会放宽TS对MyType的类型校验,会丢失部分类型安全能力:

export type MyType = {
  [key: string]: {
    age: number;
    preview: [{ [key: string]: string | number }];
  };
  high: {
    age: number;
    preview: [{ [key: string]: string | number }];
  };
  low: {
    age: number;
    preview: [{ [key: string]: string | number }];
  };
  medium: {
    age: number;
    preview: [{ [key: string]: string | number }];
  };
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:24:04