考虑以下代码:
interface MyObject {
a: string,
b: string
}
@Component({
selector: 'hello',
template: `<h1>Hello {{name}}!</h1>`,
styles: [`h1 { font-family: Lato; }`]
})
export class HelloComponent implements OnInit, AfterViewInit {
@Input() name: string;
o: MyObject;
constructor(private parent: AppComponent) {
}
ngOnInit() {
this.getObject(5)
.pipe(
filter(Boolean), // removing this causes an error
catchError(err => {
console.log(err);
return Observable.empty();
})
).subscribe(obj => {
this.o = obj;
console.log(obj);
});
}
getObject(id: number): Observable<MyObject> {
if (id && typeof id !== 'undefined') {
let obj: MyObject = { a: 'x', b: 'y'};
return Observable.of(obj);
}
return Observable.empty();
}
}
方法getObject返回一个MyObject类型的Observable或一个空的observable。我认为当你返回一个空的observable时,.subscribe不会被调用,因为它立即完成并且没有要订阅的元素。
然而,我收到错误:
输入&#39; {} |为MyObject&#39;不能分配给&#39; MyObject&#39;。 输入&#39; {}&#39;不能分配给&#39; MyObject&#39;。
如果我添加过滤器(布尔值),则错误消失。因为我没有返回Observable.of({}),所以我很困惑为什么会收到此错误消息。
答案 0 :(得分:1)
我认为当你返回一个空的observable时,.subscribe不会被调用,因为它立即完成并且没有要订阅的元素。
它立即完成,但subscribe
仍然执行 - 因为你马上执行它。您的next
处理程序将永远不会被调用。这是一个很好的区别。但是,这与此问题无关。
然而,我收到一个错误:[...]
这是来自Typescript编译器的静态类型检查。您只需要正确键入空的observable:
return Observable.empty<MyObject>();