Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Erro no validator

apresentou o seguinte erro:

ERROR in src/app/home/signup/user-not-taken.validator.service.ts(18,33): error TS2345: Argument of type '(userName: any) => void' is not assignable to parameter of type '(value: any, index: number) => ObservableInput<{}>'.
  Type 'void' is not assignable to type 'ObservableInput<{}>'.

Segue o código:

import { Injectable } from '@angular/core';
import { AbstractControl } from '@angular/forms';
import { SignUpService } from "./signup.service";

import { debounceTime, switchMap, map } from 'rxjs/operators';

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

    constructor(private signUpService: SignUpService){}

    checkUserNameTaken() {

        return (control: AbstractControl) => {
            return control
                .valueChanges
                .pipe(debounceTime(300))
                .pipe(switchMap(userName => 
                    this.signUpService.checkUserNameTaken(userName)
                ))
                .pipe(map(isTaken => isTaken ? { userNameTaken: true} : null))
        }
    }
}
2 respostas

Oi Ivan,

não conheço muito do RxJS, mas pelo que entendi do erro, a função de callback que é passada para no switchMap deveria receber dois parâmetros obrigatoriamente. O primeiro parâmetro continua sendo userName do tipo any, e o segundo seria a posição dele no Observable.

Seguindo isso, o código lá do switchMap ficaria assim:

.pipe(switchMap((userName, index) => 
    this.signUpService.checkUserNameTaken(userName)
))

Outro ponto é que o RxJS está esperando que essa função de callback retorne um ObservableInput<{}>. No caso do seu código , ela está reotrnando o resultado dessa instrução, que é void: this.signUpService.checkUserNameTaken(userName). Olhando assim, essa função deveria estar retornando um ObservableInput<{}>.