Typescript 索引签名';当尝试使用instanceof比较值时,它不起作用
我需要遍历一个对象并访问其属性,使用lodash查找数组。我想检查键的属性是否是Typescript 索引签名';当尝试使用instanceof比较值时,它不起作用,typescript,lodash,Typescript,Lodash,我需要遍历一个对象并访问其属性,使用lodash查找数组。我想检查键的属性是否是数组的实例。考虑以下事项: const记录:main记录={ 身份证号码:“10”, 第一场:“Foo”, __typename:“Main”, 相关的:[ { 身份证号码:“20”, 第二场:“酒吧”, __类型名称:“相关” }, { id:“21”, 第二场:“巴兹”, __类型名称:“相关” }, ] } //要迭代键并检查数组类型值吗 //无论属性的名称是什么。 _.keys(记录).map((键)=>{
数组的实例。考虑以下事项:
const记录:main记录={
身份证号码:“10”,
第一场:“Foo”,
__typename:“Main”,
相关的:[
{
身份证号码:“20”,
第二场:“酒吧”,
__类型名称:“相关”
},
{
id:“21”,
第二场:“巴兹”,
__类型名称:“相关”
},
]
}
//要迭代键并检查数组类型值吗
//无论属性的名称是什么。
_.keys(记录).map((键)=>{
控制台日志(键);
数组的记录[“相关”]实例//无TS编译器错误。
数组的记录[“id”]实例//TS编译器错误!
将[“id”]记录为数组的任何实例//这实际上很好。
record[key]instanceof Array//Error!(这就是我要做的)
将[key]记录为数组的任意实例//也是一个错误。这是为什么?
//if(记录数组的[key]实例){
// // ....
// }
})
当我尝试检查记录[键]
的实例时,我得到以下编译器错误:
元素隐式具有“any”类型,因为“string”类型的表达式不能用于索引类型“MainRecord”。在“MainRecord”类型上找不到具有“string”类型参数的索引签名。
有什么想法吗?TypeScript编译器向record[key]
抱怨key
的类型是字符串,而不是主记录的KeyofMainRecord
,这可能是因为lodashkeys()
方法的键入不精确,可能与Object.keys()
的键入一样
您应该使用类型断言来解决此问题:
_.keys(record).map(k => {
const key = k as keyof MainRecord;
// if (record[key] instanceof Array) {
// // ....
// }
})
如果您发布了MainRecord
的类型定义,可能会有助于找到答案。实际上,我对这个问题的解决方案采取了完全不同的方向,但这里提供的答案是正确的(TS编译)。我猜我在定义record
时,假设MainRecord
的类型定义是隐含的。