Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro - Atribuíção Promise<>

O return está apresentando o seguinte erro em tempo de execução:

[ts] O tipo Promise<void | Negociacao[]> não pode ser atribuído ao tipo Promise<Negociacao[]>. O tipo'void | Negociacao[] não pode ser atribuído ao tipo Negociacao[]. O tipo void não pode ser atribuído ao tipo Negociacao[].

Contudo isto não impediu da aplicação rodar e nem apresentou erro no console, teria algo errado?

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

export class NegociacaoService {

    obterNegociacoes(handler: HandlerFunction): 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 HandlerFunction {

    (res: Response): Response;
}
1 resposta
solução!

Oi Matheus,

Há uma coisa errada, sim, no tipo do retorno do método obterNegociacoes. Isso é um erro no TypeScript, porém não é um erro no JavaScript. O Sistema de Tipos do Typescript nunca irá alterar o código JavaScript gerado, ou seja, mesmo com erros de tipagem, o código JavaScript será gerado. Essa é uma das premissas de design do Type Script. Você pode conferir isso, aqui: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals

O que há de errado é que no momento em que você adiciona um .catch no resultado do fetch(), você assume que uma Promise rejeitada pode ser retornada, além da Promise resolvida com uma lista NegociacaoParcial[].

Como uma Promise rejeitada é uma Promise<void> para o TypeScript. O compilador reclama que o método obterNegociacoes deveria declarar o retorno como Promise<void|NegociacaoParcial[]>.

A assinatura do método ficaria assim:

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