Angular TypeScript在访问对象属性时发出警告

Angular TypeScript在访问对象属性时发出警告,angular,typescript,Angular,Typescript,我正在研究Angular 4。我试图使用for循环来循环对象/数组。 我在控制台中得到输出,但在构建和编译中得到错误。不知道我犯了什么错误 我的数据如下所示 let ArrayVal = [{ comparator: 'EQ', flight: [{ number: 123 }, { grouping: 'Flight Group South America' }] },

我正在研究Angular 4。我试图使用for循环来循环对象/数组。 我在控制台中得到输出,但在构建和编译中得到错误。不知道我犯了什么错误

我的数据如下所示

let ArrayVal =  [{
       comparator: 'EQ',
       flight: [{
           number: 123
          }, {
           grouping: 'Flight Group South America'
          }]
      }, {
       comparator: 'NEQ',
       flight: [{
           number: 7000,
           endNumber: 7999
          }]
      }];
现在我需要从上面的数据中提取数字,预期的输出是数字= ['123','7000-7999']

所以我试过这样的方法

let numbers: any = [];
for ( let val of ArrayVal){
 for (let flight of val.flight) {
    if ( flight.hasOwnProperty('number') && flight.hasOwnProperty('endNumber') ) {
      numbers.push(flight.number + '-' + flight.endNumber );
    }else if  (flight.hasOwnProperty('number')) {
      numbers.push(flight.number);
    }
 }
}
console.log(numbers)
我在控制台numbers=[123,“7000-7999”]中获得了预期的输出,但问题是在构建和编译中出现了错误

TS2339: Property 'endNumber' does not exist on type '{ number: number; } | { grouping: string; }'.
      Property 'endNumber' does not exist on type '{ number: number; }'.
TS2339: Property 'number' does not exist on type '{ number: number; } | { grouping: string; }'.
  Property 'number' does not exist on type '{ grouping: string; }'.
有人能告诉我并帮我循环这些数据吗。
flight.number给出错误属性number在类型“{number:number;}{grouping:string;}”上不存在将
any[]
添加到ArrayVal的声明中

发生这种情况是因为
TypeScript
试图推断数组中包含的对象的结构,但由于两个
flight
数组的结构不同,因此推断错误

检查以下各项

更新:

更干净的方法是为数据定义接口(这意味着实际使用TS):

而不是:

for (let flight of val.flight) {
    if ( flight.hasOwnProperty('number') && flight.hasOwnProperty('endNumber') ) {
      numbers.push(flight.number + '-' + flight.endNumber );
    }else if  (flight.hasOwnProperty('number')) {
      numbers.push(flight.number);
    }
 }
你可以做:

 for (let flight of val.flight) {
    if ( flight?.number && flight?.endNumber ) {
      numbers.push(flight.number + '-' + flight.endNumber );
    } else if (flight?.number) {
      numbers.push(flight.number);
    }
 }

这是为了确保
number
endNumber
不是0。这是解决方案,但我不建议添加
any
,因为typescript是强类型的。我们将失去typescript功能的全部本质。这将是一个肮脏的黑客来愚弄编译器。现在我同意你的看法。据我所知,这不会阻止警告。我只是尝试了一下,这个“存在运算符”没有错误或警告。如果存在属性,则子表达式的计算结果为true;如果不是,则计算结果为false。
?。
运算符“吸收”空引用,它是专门为这种类型或属性访问而设计的。
 for (let flight of val.flight) {
    if ( flight?.number && flight?.endNumber ) {
      numbers.push(flight.number + '-' + flight.endNumber );
    } else if (flight?.number) {
      numbers.push(flight.number);
    }
 }