我从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的回答帮助我看到了这一点。
答案 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));