元素隐式具有“any”类型,因为类型为“string”的表达式不能用于索引

正在尝试React项目的TypeScript,我遇到了以下错误:

元素隐式具有“any”类型,因为“string”类型的表达式不能用于索引类型“{train_1:boolean;train_2:boolean;train_3:boolean;train_4:boolean;}”。
在类型{train_1:boolean;train_2:boolean;train_3:boolean;train_4:boolean;}上未找到具有“string”类型参数的索引签名

当我尝试过滤组件中的数组时出现

.filter(({name})=>plotOptions[name]);

到目前为止,我看了“在TypeScript中索引对象”一文(https://dev.to/kingdaro/indexing-objects-in-typescript-1cgi)因为它有一个类似的错误,但是我尝试将索引签名添加到typeplotypes中,仍然得到相同的错误

我的组件代码:

导入React,{Component}来自“React”;
从“react plotly.js/factory”导入createPlotlyComponent;
从“Plotly.js基本区”导入Plotly;
常量绘图=createPlotlyComponent(绘图);
接口IProps{
资料:有;
}
界面状态{
[键:字符串]:打印类型;
绘图选项:绘图类型;
}
类型plotTypes={
[键:字符串]:布尔值;
第1列:布尔型;
序列2:布尔型;
序列3:布尔型;
第4列:布尔型;
};
接口列车信息{
名称:字符串;
x:数组<编号>;
y:数组<编号>;
类型:字符串;
模式:字符串;
}
类过滤图扩展组件<IProps,IState>{
只读状态={
打印选项:{
列车1:是的,
列车2:是的,
列车3:是的,
列车4:对
}
};
render(){
const{data}=this.props;
const{plotOptions}=this.state;
if(data.filterationdata){
常量绘图数据:数组<trainInfo>=[
{
名称:“1号列车”,
x:data.filterationdata.map((i:any)=>i[“1-CumVol”]),
y:data.filterationdata.map((i:any)=>i[“1-PressureA”]),
键入:“散布”,
模式:“行”
},
{
名称:“列车2”,
x:data.filterationdata.map((i:any)=>i[“2-CumVol”]),
y:data.filterationdata.map((i:any)=>i[“2-PressureA”]),
键入:“散布”,
模式:“行”
},
{
名称:“列车3”,
x:data.filterationdata.map((i:any)=>i[“3-CumVol”]),
y:data.filterationdata.map((i:any)=>i[“3-PressureA”]),
键入:“散布”,
模式:“行”
},
{
名称:“列车4”,
x:data.filterationdata.map((i:any)=>i[“4-CumVol]”),
y:data.filterationdata.map((i:any)=>i[“4-PressureA”]),
键入:“散布”,
模式:“行”
}
].filter(({name})=>plotOptions[name]);
返回(
<绘图
数据={plotData}
布局={{宽度:1000,高度:1000,标题:“一个奇特的情节”}
/&燃气轮机;
);
}否则{
返回<h1>未加载数据</h1>;
}
}
}
导出默认过滤图;

发生这种情况的原因是您试图使用字符串name访问plotOptions属性。TypeScript理解name可以有任何值,而不仅仅是plotOptions中的属性名称。因此,TypeScript需要将索引签名添加到plotOptions,以便它知道您可以使用plotOptions中的任何属性名称。但我建议更改name的类型,这样它只能是plotOptions属性之一

接口列车信息{
名称:绘图选项类型的键;
x:数组<编号>;
y:数组<编号>;
类型:字符串;
模式:字符串;
}

现在,您将只能使用plotOptions中存在的属性名称

您还必须稍微更改代码

首先将数组分配给某个临时变量,以便TS知道数组类型:

常量plotDataTemp:Array<列车信息>=[
{
名称:“1号列车”,
x:data.filterationdata.map((i:any)=>i[“1-CumVol”]),
y:data.filterationdata.map((i:any)=>i[“1-PressureA”]),
键入:“散布”,
模式:“行”
},
// ...
}

然后筛选:

const plotData=plotDataTemp.filter({name})=>plotOptions[name]);

如果您正在从API获取数据,并且在编译时无法键入检查道具,那么唯一的方法就是将索引签名添加到绘图选项中:

类型tplotOptions={
[键:字符串]:布尔值
}
常量绘图选项:tplotOptions={
列车1:是的,
列车2:是的,
列车3:是的,
列车4:对
}

发表评论