我创建了一个pipe
,可以将任何源转换为Observable
,如下:
// If T is like an Observable it infers the inner value, otherwise it returns T
type Unobservable<T> = T extends Observable<infer R> ? R : T;
@Pipe({
name: 'toObservable'
})
export class ToObservablePipe implements PipeTransform {
transform<T>(value: T): Observable<Unobservable<T>> {
return isObservable(value) ? value : just(value);
}
}
该功能本身有效,但是我面临着返回类型的问题。当前它显示以下错误:
Type'(T&Observable)| “可观察”不能分配给“可观察>”类型。类型“ T&Observable”不可分配给类型“ Observable>”。无法将类型“未知”分配给类型“不可观察”。
就上下文而言,管道的使用可以像这样:
<h4>Array source</h4>
<pre>{{ array | toObservable | async | json }}</pre>
如何使编译器“快乐”? :)
您可以使用重载作为@angular/AsyncPipe:
您可以通过这种方式获得相同的结果,而无需使用推断。
import { Pipe, PipeTransform } from "@angular/core";
import { isObservable, Observable, of as just } from "rxjs";
type Unobservable<T> = T extends Observable<infer R> ? R : T;
type ObservableOrAny<T> = Observable<T> | T;
@Pipe({
name: "toObservable"
})
export class ToObservablePipe implements PipeTransform {
transform<T>(value: ObservableOrAny<T>): Observable<Unobservable<ObservableOrAny<T>>> {
return isObservable(value) ? value : just(value);
}
}
Observable<Unobservable<any>>