Estoy haciendo esto en uno de mis guardias de ruta...
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { // go through each check sequentially, stop process if one does throwError return of(true).pipe( // Is there a limit to operators in a pipe??? switchMap(() => of(true)), // simplified for this post...usually call a function that returns switchMap(() => of(true)), switchMap(() => of(true)), switchMap(() => of(true)), switchMap(() => of(true)), switchMap(() => of(true)), switchMap(() => of(true)), switchMap(() => of(true)), // if any function returns throwError, we skip other checks catchError(() => of(false)) ); }Me estoy encontrando con un error. Si hay un switchMap más agregado a la lista, VSCode me dice... "El tipo 'Observable<{}>' no se puede asignar al tipo 'Observable'. El tipo '{}' no se puede asignar al tipo 'boolean'.ts (2322)"
¿Alguien puede explicarme por qué es así? No puedo resolverlo y encontrar problemas relacionados.
Esto está bastante bien explicado en este problema de github .
La esencia de esto es que solo se admiten 9 operadores; más y volverá a escribir Observable<{}> ya que tienen que escribir todo manualmente hasta 9 operadores.
Use múltiples tuberías (mantiene typesafety después de la novena entrada)
Si aún desea mantener la seguridad de tipos pero agrega más de 9 operadores, simplemente llame a la función de canalización nuevamente.
source$ .pipe( tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}) ) .pipe( // Add the next operators after the 9nth here tap(() => {}) )Afirmar manualmente el tipo resultante
Alternativamente, puede agregar una afirmación de tipo manual al final. Sin embargo, tenga cuidado: después del noveno operador, el tipo se inferirá como Observable<{}> , perdiendo efectivamente la seguridad de tipos.
const source$:Observable<boolean> = of(true) .pipe( tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), tap(() => {}), // Typesafety is lost here tap(() => {}), tap(() => {}), // Manually assert the type at the end // Beware that the compiler will allow pretty much anything here, // so "as Observable<string>" would work, even though it'd be wrong. ) as Observable<boolean>;