1
resposta

Não consegui implementar o catch...

Não consegui implementar o catch na classe NegociacaoService ao tentar fazê-lo o VSCode me retorna o seguinte erro:

Type 'Promise<void | Negociacao[]>' is not assignable to type 'Promise<Negociacao[]>'.
  Type 'void | Negociacao[]' is not assignable to type 'Negociacao[]'.
    Type 'void' is not assignable to type 'Negociacao[]'.

Porém, se eu implementar o mesmo catch na classe NegociacaoController funciona normalmente. Não encontrei o que fiz de errado.

Seguem as classes citadas:

import { Negociacao, NegociacaoParcial } from '../models/index'

export class NegociacaoService {

    obterNegociacoes(handler: ResponseHandler): Promise<Negociacao[]> {

        return fetch('http://localhost:8080/dados')
            .then(res => handler(res))
            .then(res => res.json())
            .then((dados: NegociacaoParcial[]) => 
                dados.map(dado => new Negociacao(new Date(), dado.vezes, dado.montante)))
            .catch(err => console.log(err));

    }

}

export interface ResponseHandler {
    (res: Response): Response;
}
import { Negociacoes, Negociacao, NegociacaoParcial } from '../models/index';
import { NegociacoesView, MensagemView } from '../views/index';
import { domInject, throttle, imprime } from '../helpers/index';
import { NegociacaoService } from '../services/index';

export class NegociacaoController {

    @domInject('#data')
    private _inputData: JQuery;

    @domInject('#quantidade')
    private _inputQuantidade: JQuery;

    @domInject('#valor')
    private _inputValor: JQuery;

    private _negociacoes = new Negociacoes();
    private _negociacoesView = new NegociacoesView('#negociacoesView');
    private _mensagemView = new MensagemView('#mensagemView');
    private _service = new NegociacaoService();

    constructor() {
        this._negociacoesView.update(this._negociacoes);
    }

    @throttle()
    adiciona() {

        let data = new Date(this._inputData.val().replace(/-/g, ','));

        if (!this.ehDiaUtil(data)) {
            this._mensagemView.update('Por favor, realize negociações apenas em dias úteis!');
            return;
        }

        const negociacao = new Negociacao(
            data, 
            parseInt(this._inputQuantidade.val()), 
            parseFloat(this._inputValor.val())
        );

        this._negociacoes.adiciona(negociacao);

        this._negociacoesView.update(this._negociacoes);
        this._mensagemView.update('Negociação adicionada com sucesso');

        imprime(negociacao, this._negociacoes);
    }

    private ehDiaUtil(data: Date): boolean {
        return (data.getDay() != DiaDaSemana.Sabado && data.getDay() != DiaDaSemana.Domingo);
    }

    @throttle()
    importar() {
        this._service.obterNegociacoes(res => {
                if (res.ok) return res;
                else throw new Error(res.statusText);
            })
            .then(negociacoesParaImportar => {
                const negociacoesJaImportadas = this._negociacoes.paraArray;
                negociacoesParaImportar.filter(negociacao => 
                        !negociacoesJaImportadas.some(jaImportada => 
                            negociacao.ehIgual(jaImportada))
                    ).forEach(negociacao => 
                        this._negociacoes.adiciona(negociacao));
                this._negociacoesView.update(this._negociacoes);
            })
            .catch(err => console.log(err));
    }
}

enum DiaDaSemana {

    Domingo,
    Segunda,
    Terca,
    Quarta,
    Quinta,
    Sexta,
    Sabado

}
1 resposta

Olá Leandro, tudo bem com você?

Realmente eu também passei pelo mesmo problema quando fiz o curso, acontece que nesse primeiro momento estávamos dentro do catch retornando um valor vazio, e por isso o vscode reclamava que de fato não estávamos enviando um Negociacao[] para corrigir isso precisaríamos mudar para:

obterNegociacoes( handler: ResponseHandler) : Promise <void | Negociacao[]>

Entretanto nessa mesma aula, que acredito que já assistiu, o instrutor ao invés de apenas dar o console.log também retorna um erro e dessa forma podemos deixar da maneira que estava:

obterNegociacoes(handler: ResponseHandler): Promise<Negociacao[]>{

Provavelmente esse "problema" apenas não aconteceu com o instrutor porque na época o vscode não tinha uma integração tão boa com o typescript a ponto de conseguir capturar todos os resultados de uma promise :)

Agora uma coisa que eu notei em seu código é que esta faltando chamar a função para obter um array na função de importar(), deveria ser:

const negociacoesJaImportadas =  this._negociacoes.paraArray();

Abraços e Bons Estudos!