如何修复TypeScript错误:元素隐式'any'类型无法索引空对象
TypeScript错误修复方案:对象索引类型不匹配问题
错误原因
代码中reduce的初始值为{},TypeScript默认将其推断为{}类型。当使用字符串类型的modifiedKey为该对象赋值时,由于空对象未定义字符串索引签名,触发类型错误。
修复方案
方案1:给初始值添加类型断言
通过as Record<string, string>明确初始值是键值均为字符串的对象:
const a = { '/app/developer-tools/API-keys': '/app/developer-tools/API-keys', '/app/developer-tools/API-reference': '/app/developer-tools/API-reference', '/app/engage': '/app/engage', }; export const modifiedPaths = Object.keys(a).reduce((acc, key) => { const modifiedKey = key.replace("/app/", ""); acc[modifiedKey] = a[key]; return acc; }, {} as Record<string, string>);
方案2:为reduce指定泛型参数
提前定义返回对象的类型,通过泛型参数告知TypeScript累加器的类型:
const a = { '/app/developer-tools/API-keys': '/app/developer-tools/API-keys', '/app/developer-tools/API-reference': '/app/developer-tools/API-reference', '/app/engage': '/app/engage', }; type ModifiedPaths = { [key: string]: string; }; export const modifiedPaths = Object.keys(a).reduce<ModifiedPaths>((acc, key) => { const modifiedKey = key.replace("/app/", ""); acc[modifiedKey] = a[key]; return acc; }, {});
方案3:精确类型推导(保留修改后键的字面量类型)
如果需要让modifiedPaths的键为原键去掉/app/后的具体字面量类型,可使用以下写法:
const a = { '/app/developer-tools/API-keys': '/app/developer-tools/API-keys', '/app/developer-tools/API-reference': '/app/developer-tools/API-reference', '/app/engage': '/app/engage', } as const; type OriginalKeys = keyof typeof a; type ModifiedKeys = OriginalKeys extends `/app/${infer Rest}` ? Rest : never; export const modifiedPaths = Object.keys(a).reduce((acc, key) => { const modifiedKey = key.replace("/app/", "") as ModifiedKeys; acc[modifiedKey] = a[key]; return acc; }, {} as Record<ModifiedKeys, string>);
此方案下modifiedPaths的键会被精确推断为'developer-tools/API-keys'、'developer-tools/API-reference'、'engage',而非宽泛的string类型。
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

