通过FirebaseListObservable <any []>进行映射时输入错误

时间:2016-12-27 23:43:42

标签: typescript firebase firebase-realtime-database angularfire2

我从Firebase抓取一个集合并尝试映射集合,返回对象实例。我的代码如下所示:

class Todo {
  constructor(public text: string) { }
}

this.db.list('todos').map(todo => {
  return new Todo(todo);
});

这实际上有效,但我在new Todo(todo)行上看到一个TypeScript intellisense错误:

Argument of type 'any[]' is not assignable to parameter of type 'string'.

我可以看到this.db.list返回FirebaseListObservable<any[]>类型。但是,当我调试此行并获得todo类型时,它会报告它是一个字符串而不是任何类型的数组。

我不太确定如何让TypeScript在这里开心。

更新

结果证明这是一个错误。我在测试中错误地模拟了Firebase的可观察响应,并且以错误的方式查看结果。 Cartant的回答帮助我看到了这一点。

1 个答案:

答案 0 :(得分:1)

list返回的可观察量将发出一系列待办事项;没有一个待办事项。也就是说,它会发出any[],并且发出的数组中的每个元素都对应todos下的一个键。

如果todos下的键具有字符串值,AngularFire2应该发出一个包装值数组,如下所示:

[{
  $value: '<value1>',
  $key: '<key1>'
}, {
  $value: '<value2>',
  $key: '<key2>'
}]

您可能希望使用Array.prototype.map返回todos数组:

this.db
  .list('todos')
  .map((todos: any[]) => todos.map((todo: any) => new Todo(todo.$value));