Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 类型安全仅访问对象的特定数组类型参数_Javascript_Typescript_Typescript2.0 - Fatal编程技术网

Javascript 类型安全仅访问对象的特定数组类型参数

Javascript 类型安全仅访问对象的特定数组类型参数,javascript,typescript,typescript2.0,Javascript,Typescript,Typescript2.0,我想访问对象的一组属性,我知道这些属性都是数组。请问我如何做到这一点 接口过滤器项{ id:编号; 名称:字符串; } 接口组织FilterItem扩展FilterItem{ organizationTypeId:编号; } 接口滤波器{ serviceProviderId:编号; farmid:number[]; OrganizationID:编号[]; userId:number; 可能字段:FilterItem[]; 可能参数:FilterItem[]; CropTypeId:编号[];

我想访问对象的一组属性,我知道这些属性都是数组。请问我如何做到这一点

接口过滤器项{
id:编号;
名称:字符串;
}
接口组织FilterItem扩展FilterItem{
organizationTypeId:编号;
}
接口滤波器{
serviceProviderId:编号;
farmid:number[];
OrganizationID:编号[];
userId:number;
可能字段:FilterItem[];
可能参数:FilterItem[];
CropTypeId:编号[];
平面:编号[];
可能的组织:OrganizationFilterItem[];
可能的复制类型:FilterItem[];
可能的计划:FilterItem[];
fieldid:number[];
[key:string]:过滤器[keyof Filter];
}
类型Possibles='possibleOrganizations'|'PossibleForms'|'possiblePlans'|'possibleCropTypes'|'possibleFields'
类型ID='OrganizationID'|'FarmID'|'PlanID'|'CropTypeID'|'FieldID'
常量myFilter:筛选器={
cropTypeIds:[2,3,4,7,9,21,33,54],
FarmId:[1,2,3,4],
字段ID:[3,6,9,4,2,66,99,22],
serviceProviderId:1,
OrganizationId:[6,3,8,2],
平面图:[7,12],
可能的领域:[
{id:3,名称:'FieldNo3'},
{id:6,名称:'FieldNo6'},
{id:9,名称:'FieldNo9'},
{id:4,名称:'FieldNo4'},
{id:2,名称:'FieldNo2'},
{id:66,名称:'FieldNo66'},
{id:99,名称:'FieldNo99'},
{id:22,名称:'FieldNo22'}
],
可能格式:[
{id:13,名称:'FarmNo13'},
{id:56,名称:'FarmNo56'},
{id:43,名称:'FarmNo43'},
{id:87,名称:'FarmNo87'},
{id:52,名称:'FarmNo52'}
],
可能的组织:[
{id:2,名称:'OrgNo2',organizationTypeId:1},
{id:3,名称:'OrgNo3',organizationTypeId:1},
{id:6,名称:'OrgNo6',organizationTypeId:2},
{id:8,名称:'OrgNo8',organizationTypeId:1},
{id:12,名称:'OrgNo12',organizationTypeId:2},
{id:32,名称:'OrgNo32',organizationTypeId:1},
{id:54,名称:'OrgNo54',organizationTypeId:3}
],
可能的副本类型:[
{id:2,名称:'CropTypeNo2'},
{id:3,名称:'CropTypeNo3'},
{id:4,名称:'CropTypeNo4'},
{id:7,名称:'CropTypeNo7'},
{id:9,名称:'CropTypeNo9'},
{id:21,名称:'CropTypeNo21'},
{id:33,名称:'CropTypeNo33'},
{id:54,名称:'CropTypeNo54'}
],
可能的计划:[
{id:7,名称:'PlanNo2'},
{id:12,名称:'PlanNo12'},
{id:32,名称:'PlanNo32'},
{id:56,名称:'PlanNo56'}
],
用户ID:22
}
const filterNameLookup:{[key:Possibles]:IDs}={
可能的组织:“OrganizationID”,
可能参数:“FarmId”,
可能的计划:“PlanId”,
可能的复制类型:“CropTypeId”,
可能字段:“字段ID”
}
常量重置筛选器=()=>{
const possibleKeys=Object.keys(filterNameLookup)
可能的键。forEach((键)=>{
if(myFilter[key].length==myFilter[filterNameLookup[key]].length){
myFilter[filterNameLookup[key]]。长度=0
}
})
}
如何确保仅以类型安全的方式读取MyFilter中的数组?我当前收到typescript错误:

TS2339: Property 'length' does not exist on type 'number | boolean | number[] | FilterItem[] | OrganizationFilterItem[]'.
  Property 'length' does not exist on type 'number'.
运行“resetFilter()”后的预期结果将是(没有typescript错误):

myFilter={
CropTypeId:[],
FarmId:[1,2,3,4],
字段ID:[],
serviceProviderId:1,
OrganizationId:[6,3,8,2],
平面图:[7,12],
可能字段:[3,6,9,4,2,66,99,22],
可能值:[13,56,43,87,52],
可能的组织:[2,3,6,8,12,32,54],
可能的复制类型:[2,3,4,7,9,21,33,54],
可能的计划:[7,12,32,56,98],
用户ID:22
}

非常感谢您的关注;)

让我们从
过滤器
界面开始

接口过滤器{
serviceProviderId:编号;
farmid:number[];
OrganizationID:编号[];
userId:number;
可能字段:FilterItem[];
可能参数:FilterItem[];
CropTypeId:编号[];
平面:编号[];
可能的组织:OrganizationFilterItem[];
可能的复制类型:FilterItem[];
可能的计划:FilterItem[];
fieldid:number[];
[key:string]:过滤器[keyof Filter];//这是错误的
}
使用
[key:string]:Filter[keyof Filter]
没有意义?你是否期望有双重属性?你想要什么形状的物体

接口过滤器{
fieldid:number[];
fieldid:number[];
[key:string]:Filter[keyof Filter];//由于索引,属性被双重化
}
因此,我删除了
[key:string]:Filterp[keyof Filter]

这是我的解决方案:

接口过滤器项{
id:编号;
名称:字符串;
}
接口组织FilterItem扩展FilterItem{
organizationTypeId:编号;
}
接口滤波器{
serviceProviderId:编号;
farmid:number[];
OrganizationID:编号[];
userId:number;
可能字段:FilterItem[];
可能参数:FilterItem[];
CropTypeId:编号[];
平面:编号[];
可能的组织:OrganizationFilterItem[];
可能的复制类型:FilterItem[];
可能的计划:FilterItem[];
fieldid:number[];
//[key:string]:过滤器[keyof Filter];
}
类型ID='OrganizationID'|'FarmID'|'PlanID'|'CropTypeID'|'FieldID'
常量myFilter:筛选器={
cropTypeIds:[2,3,4,7,9,21,33,54],
FarmId:[1,2,3,4],
字段ID:[3,6,9,4,2,66,99,22],
serviceProviderId:1,
OrganizationID:[6,3,8,2],
平面:[7,12],
可能的领域:[
{id:3,名称:'FieldNo3'},
{id:6,名称:'FieldNo6'},
{id:9,名称:'FieldNo9'},
{id:4,名称:'FieldNo4'},
{id:2,名称:'FieldNo2'},
{id:66,名称:'FieldNo66'},
{id:99,名称:'FieldNo99'},
{id:22,名称:'FieldNo22'}
],
可能格式:[
{id:13,名称:'FarmNo13'},
{id:56,名称:'FarmNo56'},
{id:43,名称:'FarmNo43'},
{id:87,名称:'FarmNo87'},
{id:52,名称:'FarmNo52'}
],
可能的组织:[
{id:2,名称:'OrgNo2',organizationTypeId:1},
{id:3,名称:'OrgNo3',organizationTypeId:1},
{id:6,名称:'OrgNo6',