TypeScript操作基础对象时报参数key隐式具有any类型如何解决
问题原因
- 报错的核心触发条件是TS配置中开启了
noImplicitAny校验规则,该规则不允许参数未显式声明类型、默认推导为any的情况,你遇到的初始报错就是getItem、setItem、removeItem三个方法的key参数,以及setItem的value参数未显式标注类型导致的。 - 标注any后依旧报错有两种可能:一是你只给部分方法的参数加了标注,其余参数仍为隐式any;二是你忽略了
store变量的类型问题:你声明的store初始值为{},TS默认推导它的类型为空对象类型,该类型没有索引签名,不允许用任意key做访问和赋值,就算参数标了any也会触发索引不合法的报错。
解决方法
方案1:完整标注类型(最推荐,类型安全)
给store添加索引签名,同时给所有参数显式标注类型,符合TS开发规范:
// 声明store是key为字符串、value为字符串的键值对对象 let store: Record<string, string> = {}; return { getItem: (key: string) => { return store[key] || null; }, // value可以标注为any,因为后续会调用toString做转换 setItem: (key: string, value: any) => { store[key] = value.toString(); }, removeItem: (key: string) => { delete store[key]; }, clear: () => { store = {}; }, };
方案2:快速兼容修复(仅临时调试用,不推荐长期使用)
如果不需要严格类型校验,可以修改tsconfig.json中的配置关闭相关校验:
{ "compilerOptions": { "noImplicitAny": false, "suppressImplicitAnyIndexErrors": true } }
修改后无需改动代码即可消除报错,但会失去TS的类型保护能力。
方案3:支持任意类型作为key
如果你确实需要用数字、对象等非字符串类型作为store的key,可以把store和参数的类型都标注为any:
let store: Record<any, string> = {}; return { getItem: (key: any) => { return store[key] || null; }, setItem: (key: any, value: any) => { store[key] = value.toString(); }, removeItem: (key: any) => { delete store[key]; }, clear: () => { store = {}; }, };
内容的提问来源于stack exchange,提问作者Udders
相关产品推荐
相关产品推荐

