我想将数组转换为类型Observable<T[]>
,并使用了rxjs方法“ from”。但是它返回Observable<T>
,有没有办法将数组转换为Observable<T[]>
?
Player: Observable<T[]>;
convert(){
let tempArr:T[] = Object.values(data) as T[];
let Obsobj = from(tempArr);
this.Player = Obsobj;
}
这是我收到的错误消息,
Observable<T>
不可分配为类型Observable<T[]>
编辑
即使使用以下代码段返回类型也不是预期的。
let $sub = new Subject<Array<T>>();
$sub.next(tempArr);
this.Player$ = $sub.asObservable();
由于我希望返回的可观察类型如下。
Observable {_isScalar: false, source: Observable, operator: MapOperator}
,但返回了以下内容。
Observable {_isScalar: false, source: Subject}
编辑#2
完整的代码段。
Player: Observable<B[]>;
convert(data: Dictionary<B>){
let tempArr:B[] = Object.values(data) as B[];
let $sub = new Subject<Array<B>>();
$sub.next(tempArr);
this.Player$ = $sub.asObservable();
}
这是什么问题?有帮助吗?
答案 0 :(得分:3)
可从文档中观察到: 对于数组和可迭代对象,所有包含的值将作为序列发出! 因此,您的项目将始终以T而不是T []的形式发出。
对于Observable<T[]>
,请执行以下任一操作:
$sub = new Subject<Array<T>>();
this.Player = $sub.asObservable();
OR
this.Player = of(array);
OR
Observable.create((observer) => {observer.next(array)})
答案 1 :(得分:1)
使用of
运算符代替from
。
import { of } from 'rxjs';
...
player: Observable<T[]>;
convert(){
let tempArr:T[] = Object.values(data) as T[];
let Obsobj = of(tempArr);
this.Player = Obsobj;
}
答案 2 :(得分:1)
这不是generics的工作方式。
您必须重构代码才能使其正常工作。
理想情况下,您的convert
方法应该使用通用类型T
类似这样的东西:
convert<T>(array: Array<T>): Observable<Array<T>> {
return of(array);
}
当您致电convert
时,您会这样称呼它:
this.convert<User>([{ firstName: `John`, lastName: `Doe` }])
.subscribe((userArray: Array<User>) => console.log(userArray));
执行此操作时,您是在告诉convert
函数将类型T
设置为User
类型。
这是一个完整的工作示例:
import { Component } from '@angular/core';
import { Observable, of } from 'rxjs';
interface User {
firstName: string;
lastName: string;
}
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
player: Observable<Array<User>>;
ngOnInit() {
this.convert<User>([{ firstName: `John`, lastName: `Doe` }])
.subscribe((userArray: Array<User>) => console.log(userArray));
}
convert<T>(array: Array<T>): Observable<Array<T>> {
return of(array);
}
}