2
respostas

O tap tá inteferindo na chamada?

<div class="resultados" *ngIf="livrosEncontrados$ | async">
    <strong>{{ livrosResultado.totalItems }}</strong>
    <p> resultados encontrados</p>
  </div>
  <div
    class="container-card"
    *ngIf="
      livrosEncontrados$ | async as listaLivrosObTidosVariavelDeclaradaAqui;
      else telaInicial
    "
  >
    <div *ngFor="let livro of listaLivrosObTidosVariavelDeclaradaAqui">
      <app-livro [livro]="livro"></app-livro>
    </div>

No meu caso, se eu deixo assim, e utilizo tap, (que agora ta comentado), o código não funciona. Dando erro no 'of' do ngFor. Dizendo esse erro

*Type 'unknown' is not assignable to type 'NgIterable'.ngtsc(2322) lista-livros.component.ts(16, 3): Error occurs in the template of component ListaLivrosComponent. declare (property) NgForOf<any, NgIterable>.ngForOf: NgIterable The value of the iterable expression, which can be used as a template input variable. *

 livrosEncontrados$ = this.searchField.valueChanges.pipe( 
    debounceTime(pausa),
    tap(() => console.log('Fluxo inicial')),
    filter((valorDigitado) => valorDigitado.length >= 3),
    distinctUntilChanged(), 
    switchMap((valorDigitado) => this.service.getBooks(valorDigitado)),valor
    // tap((retornoDaAPI) => console.log('RetornoTAP', retornoDaAPI)),
    map(resultado => this.livrosResultado = resultado),
    map(resultado => resultado.items ?? []),
    map(itens =>
    this.livrosResultadoParaLivros(itens)
    ),
    catchError(error => { 
      this.mensagemError = 'Ops, houve um erro. Recarregue a aplicação'
      return EMPTY
    })
  )

Por que? O tap não deveria NÃO intervir no resultado do fluxo?

2 respostas

Olá, Yuri!

Analisando o erro yuri, aparentemente ele indica que o Angular não sabe como iterar sobre o valor que você está fornecendo. Isso pode ser porque o valor é null, undefined, ou não é um array ou objeto iterável.

O operador tap deveria, de fato, ser neutro em relação à tipagem. No entanto, ele pode afetar a inferência de tipo em certos casos, especialmente se estiver sendo utilizado em conjunto com outros operadores.

Uma possível razão para esse comportamento é que o TypeScript não está conseguindo inferir corretamente o tipo após a aplicação do tap. Isso pode ocorrer se o TypeScript não conseguir deduzir o tipo apropriado para o resultado de tap devido a alguma complexidade na lógica.

Por gentileza Yuri, tente fornecer uma tipagem explícita para o retorno do tap. Por exemplo, você pode tentar algo assim:

tap((retornoDaAPI: SeuTipoDeRetorno) => console.log('RetornoTAP', retornoDaAPI)),

Substituindo SeuTipoDeRetorno pelo tipo correto dos dados que você espera receber da API. Isso pode ajudar o TypeScript a inferir corretamente o tipo do fluxo de dados após o tap, pois segundo a mensagem de erro, é questão de tipagem e no entendimento do TS.

Espero ter ajudado! Bons estudos!

Sucesso

Um grande abraço e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá, estou com o mesmo problema, mas verifiquei que o problema nao é especialmente do tap, pois se comentar qualquer um outro que nao afete diretamente (como filter, distinctUntilChanged) o erro tambem para de acontecer