나는를 만든 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);
}
}
기능 자체는 작동하지만 반환 유형에 문제가 있습니다. 현재 다음 오류가 표시됩니다.
유형 '(T & Observable) | Observable '은'Observable> '유형에 할당 할 수 없습니다. 'T & Observable'유형은 'Observable>'유형에 할당 할 수 없습니다. 'unknown'유형은 'Unobservable'유형에 할당 할 수 없습니다.
컨텍스트를 위해 파이프의 사용은 다음과 같을 수 있습니다.
<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';
@Pipe({
name: 'toObservable'
})
export class ToObservablePipe implements PipeTransform {
transform<T>(value: null): null;
transform<T>(value: undefined): undefined;
transform<T>(value: Observable<T> | null | undefined): Observable<T> | null | undefined;
transform<T>(value: T): Observable<T> | null | undefined;
transform(value: Observable<any> | null | undefined): any {
// can be also if (value === null || value === undefined) ...
if (value == null) return value;
return isObservable(value) ? value : just(value);
}
}
일부 테스트 사례 :
const obj = { label: 1 };
// Error!
new ToObservablePipe().transform(null).subscribe(response => console.log(response));
// Error!
new ToObservablePipe().transform(undefined).subscribe(response => console.log(response));
// Inferred as string
new ToObservablePipe().transform('').subscribe(response => console.log(response));
// Inferred as number
new ToObservablePipe().transform(0).subscribe(response => console.log(response));
// Inferred as { label: number }
new ToObservablePipe().transform(just(obj)).subscribe(response => console.log(response));
// Inferred as { label: number }[]
new ToObservablePipe().transform([obj]).subscribe(response => console.log(response));
// Inferred as { label: number }
new ToObservablePipe().transform(obj).subscribe(response => console.log(response));
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다