当通过管道传输多个水龙头时,Rxjs Observable 会获取分配的 <unknown> 类型。这是为什么?

And*_*ino 7 rxjs

我注意到,如果我通过管道传输许多水龙头,可观察到的会被分配未知类型。这是为什么?

这是一个stackblitz示例。如果您注释/取消注释点击,您将看到 test$ observable 被分配了未知类型。

import { of, Observable, combineLatest, BehaviorSubject } from 'rxjs';
import { filter, map, shareReplay, switchMap, tap } from 'rxjs/operators';

interface Test {
  key1: string;
}

const _selectedId = new BehaviorSubject<string>(null);

const test$: Observable<Test[]> = combineLatest([_selectedId]).pipe(
  filter(([id]) => !!id),
  switchMap(([id]) => httpCall()),
  tap((test) => console.log(test)), //ADD OR REMOVE A TAP TO TRIGGER TYPE ERROR
  tap((test) => console.log(test)),
  tap((test) => console.log(test)),
  tap((test) => console.log(test)),
  tap((test) => console.log(test)),
  tap((test) => console.log(test)),
  tap((test) => console.log(test)),
  shareReplay(1)
);

const httpCall = (): Observable<Test[]> => {
  return of([{ key1: 'testing1' }]);
};

_selectedId.next('test');

test$.subscribe((data) => {
  console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

Mat*_*ler 8

看看Observable.tspipe中是如何定义的:

pipe(): Observable<T>;
pipe<A>(op1: OperatorFunction<T, A>): Observable<A>;
pipe<A, B>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>): Observable<B>;
pipe<A, B, C>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>): Observable<C>;
pipe<A, B, C, D>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>): Observable<D>;
pipe<A, B, C, D, E>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>): Observable<E>;
pipe<A, B, C, D, E, F>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>): Observable<F>;
pipe<A, B, C, D, E, F, G>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>): Observable<G>;
pipe<A, B, C, D, E, F, G, H>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>): Observable<H>;
pipe<A, B, C, D, E, F, G, H, I>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>, op9: OperatorFunction<H, I>): Observable<I>;
pipe<A, B, C, D, E, F, G, H, I>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>, op9: OperatorFunction<H, I>, ...operations: OperatorFunction<any, any>[]): Observable<unknown>;
Run Code Online (Sandbox Code Playgroud)

正如你所看到的最后一个定义

pipe<A, B, C, D, E, F, G, H, I>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>, op9: OperatorFunction<H, I>, ...operations: OperatorFunction<any, any>[]): Observable<unknown>;
Run Code Online (Sandbox Code Playgroud)

有一个扩展运算符...operations: OperatorFunction<any, any>[],它允许拥有您想要的任何参数并将返回Observable<unknown>

因此,该pipe方法最多支持 9 个具有正确返回类型的运算符函数,之后unknown如果再添加一个,它就会返回!