使用变量字符串索引对象时的TypeScript类型错误求助
解决TypeScript变量索引对象属性的类型错误
问题原因
代码能运行但TS报错,是因为myName被声明为string类型——严格类型检查下,TS不允许用宽泛的string去索引Details接口(Details仅包含id/name/email三个合法属性),它无法确认这个字符串变量是否为合法属性名,因此抛出"Element implicitly has an 'any' type"错误。
解决方案
方法1:限制变量类型为keyof Details
直接把myName的类型声明为Details接口的属性名集合,让TS确认它是合法索引:
const myName: keyof Details = "name"
方法2:使用类型断言(适合动态场景)
如果myName的值是动态获取的(比如用户输入),可以用类型断言告知TS该变量是合法的Details属性名:
console.log(items[myIx][0][myName as keyof Details])
注意:需自行确保myName的实际值确实是Details的属性名,否则运行时可能出现undefined。
方法3:定义属性名类型别名
若需多次使用该属性名类型,可先定义别名再声明变量:
type DetailsKey = keyof Details; const myName: DetailsKey = "name";
修正后的完整代码示例
interface Details { id: number, name: string, email: string } interface Items { [key: string]: Details[], } const items: Items = { "blackberry": [ { id: 1, name: 'John Doe', email: 'john@doe.de' }, { id: 2, name: 'Brad', email: 'lorem@ipsum.com', } ], "orange": [{ id: 4, name: 'Barry', email: 'john@doe.de' } ] } const myName: keyof Details = "name" const myIx: string = "orange" console.log(items[myIx][0].name) console.log(items[myIx][0][myName]) // 不再报错
内容的提问来源于stack exchange,提问作者Paul A
相关产品推荐
相关产品推荐

