TypeScript用string索引IRegulations报元素隐式any类型如何解决?
报错根因
你遇到的报错是因为TypeScript无法确认你传入的key字符串一定是IRegulations接口上存在的合法属性,默认不允许用任意字符串索引明确声明了结构的接口类型。
修复方案(保留原有IRegulations[]类型定义)
方案1:最小改动适配当前场景
直接将key的入参类型约束为IRegulations的属性集合即可,代码修改如下:
export const removeDublicatesFromArray = ( array: IRegulations[], key: keyof IRegulations // 仅修改这一行,替换原来的string类型 ) => { return [ ...new Map(array.map((item: IRegulations) => [item[key], item])).values(), ] }
该方案完全保留原入参类型,同时额外获得了调用时的属性名校验、自动补全能力,安全性更高。
方案2:泛型封装实现通用去重函数
如果希望这个去重函数可以适配不同类型的数组,不需要和IRegulations强绑定,可以用泛型做类型约束:
// T 约束数组项类型,K 约束为数组项的合法属性键 export const removeDublicatesFromArray = <T, K extends keyof T>( array: T[], key: K ) => { return [ ...new Map(array.map((item) => [item[key], item])).values(), ] }
调用时TypeScript会自动推导传入数组的类型,不需要手动指定泛型参数,原有调用removeDublicatesFromArray的代码不需要做任何修改即可正常运行。
不推荐的临时方案
如果确实需要传入IRegulations以外的字符串作为key(业务特殊场景),可以通过类型断言临时绕开校验,但会丢失类型安全保障:
// 仅做临时调试用,不建议长期保留 [item[key as keyof IRegulations], item]
内容的提问来源于stack exchange,提问作者kkkkkkkkkkkkkkkkk
相关产品推荐
相关产品推荐

