Typescript过滤器对象数组

时间:2018-02-07 20:35:32

标签: typescript ecmascript-6 angular-cli

我有一组像这样的对象:

questionConfig = [{
  section: 'base',
  key: 'firstName',
  label: 'First name',
  type: 'text',
  fieldType: 'input'
  required: true,  
 },
 {
  section: 'dynamic'
  key: 'emailAddress',
  label: 'Email',
  type: 'email',    
  fieldType: 'input',
  required: true,     
},
{     
  key: 'primaryPhone',
  label: ' primary phone',
  type: 'phone',     
  fieldType: 'input'
},
{    
key: 'something',
label: 'dgfdsfgds',
options: [
  {key: 1, value: 'dsfgdsg'},
  {key: 2, value: 'dfgdsfg'},
  {key: 3, value: 'dsfgdsgds'},
  {key: 4, value: 'dsfgdgsf'}
],    
fieldType: 'dropdown'
}]

如何过滤此数组以获取section ='base'的对象?

如果尝试

let questionBaseSection = this.questionConfig.filter(question => question.section === 'base' )

得到错误: 属性'section'在类型'{section:string; key:string; label:string;必需:布尔值; minLength:数字; minLengthErr ......“。   属性'section'在类型'{key:string; label:string; type:string; fieldType:string;必需:布尔值; minLength:麻木......'。

3 个答案:

答案 0 :(得分:3)

错误消息显示“'{section:string; key:string; label:string; required:boolean; minLength: number; minLengthErr...'”。这意味着questionConfig有一个具有属性minLengthminLengthErr的对象。

因此,似乎questionConfig的对象多于您在代码段中显示的对象,其中一个对象缺少属性section。 验证对象添加到questionConfig的位置。

您可以修复对象,或者更好的方法是利用TypeScript的静态类型功能,并为questionConfig中的项目定义数据类型。

答案 1 :(得分:1)

questionConfig: any[] = [{
  section: 'base',
  key: 'firstName',
  label: 'First name',
  type: 'text',
  fieldType: 'input'
  required: true,  
}, { 
  bla: 'bla', 
  ... 
}, { 
  bla: 'bla', 
  test: 'bla', 
  ... 
}];

由于您的数组似乎可以将多个不同类型的对象推送到它,因此在声明时必须将其强制转换为any[]。你得到了这个错误,因为当你在typescript中声明那个数组时,它会隐式地决定它只能在其声明的类型中包含对象。如果将其转换为any[],则不应再显示该错误Property 'blabla' does not exist on type '{ ... }',因为数组中的对象现在为any类型。

答案 2 :(得分:1)

@Pradeep Kumar已经解释了上面的问题,但我想补充一点,你可能有兴趣阅读 Type-guards and differentiating types