1
resposta

Validaçao assincrona não funciona

Boa tarde galera tudo bem? estou com um problema aqui no código, ja tentei mudar a versao do angular para 11, ja verifiquei digitação e não estou encontrando o erro se puderem me ajudar agradeço muito

fiz o código conforme o video do professor.

Trecho do usuario-existente.service.ts

import { Injectable } from '@angular/core';
import { AbstractControl } from '@angular/forms';
import { NovoUsuarioService } from './novo-usuario.service';
import { first, map, switchMap } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class UsuarioExistenteService {

  constructor(private novoUsuarioService: NovoUsuarioService) { }


  usuarioJaExiste() {
    return (control: AbstractControl) => {
      return control.valueChanges?.pipe(
        switchMap((nomeUsuario) =>
          this.novoUsuarioService.consultarUsuarioExistente(nomeUsuario)
        ),
        map((usuarioExiste) =>
          usuarioExiste ? { usuarioExistente: true } : null
          ),
          first()
      );
    };
  }



}

Erro : O tipo 'void' não pode ser atribuído ao tipo 'ObservableInput'.ts(2322) switchMap.d.ts(2, 79): O tipo esperado vem do tipo de retorno dessa assinatura. usuario-existente.service.ts(17, 19): Você quis marcar esta função como 'async'?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Alguem tem alguam ideia do que pode ser?Obrigado

1 resposta

Oi Victor, tudo bem?

Percebi que você está enfrentando um problema com a validação assíncrona em seu código Angular. Vou tentar ajudá-lo a entender e resolver esse erro.

Pelo trecho de código fornecido, é possível identificar que você está usando a função usuarioJaExiste dentro do serviço UsuarioExistenteService. Essa função retorna um validador personalizado para ser usado nos formulários.

O erro que você está enfrentando indica que o tipo de retorno da função usuarioJaExiste não está correto. A mensagem de erro específica é: "O tipo 'void' não pode ser atribuído ao tipo 'ObservableInput'". Isso ocorre porque você não está retornando um valor do tipo Observable dentro da função.

Para corrigir esse problema, você precisa ajustar o retorno da função usuarioJaExiste para retornar um Observable válido. Veja o trecho de código corrigido:

usuarioJaExiste() {
  return (control: AbstractControl) => {
    return control.valueChanges?.pipe(
      switchMap((nomeUsuario) =>
        this.novoUsuarioService.consultarUsuarioExistente(nomeUsuario)
      ),
      map((usuarioExiste) =>
        usuarioExiste ? { usuarioExistente: true } : null
      ),
      first()
    );
  };
}

Agora a função usuarioJaExiste retorna um Observable que executa a lógica de consulta do serviço novoUsuarioService para verificar se o usuário já existe. Em seguida, o resultado é mapeado para um objeto que indica se o usuário existe ou não. Por fim, o operador first() é usado para emitir apenas o primeiro valor do Observable e, em seguida, completar a emissão.

Além disso, o erro menciona a sugestão de marcar a função como 'async'. No entanto, nesse caso, não é necessário usar a palavra-chave async porque a função não contém chamadas assíncronas diretas. A validação assíncrona é tratada usando Observables e operadores como switchMap e map.

Certifique-se de importar corretamente os operadores necessários no início do seu arquivo, caso contrário, você pode ter erros de compilação relacionados a operadores ausentes. No trecho de código fornecido, você já importou switchMap e map, o que é correto.

Portanto, uma possível causa desse problema poderia ser uma versão desatualizada do pacote RxJS. Certifique-se de que sua aplicação esteja usando uma versão compatível do RxJS, que suporte os operadores switchMap, map e first. Verifique o arquivo package.json e atualize a versão do RxJS, se necessário.

Espero que essas informações sejam úteis para resolver o problema de validação assíncrona em seu código.

O post foi fechado pois o curso foi descontinuado e não faz mais parte da grade oficial