Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Usando o get no método que retorna uma lista "tipada"

Quando eu uso o get no método que retorna a lista com a negociação, o Typescript me mostra o seguinte erro:

[ts] Cannot invoke an expression whose type lacks a call signature. Type 'Negociation[]' has no compatible call signatures. (property) NegociationController._negocations: Negociations

Não consigo chamar um método quando usar o get em métodos que possuem um retorno tipado ?

4 respostas

Oii Tiago! Parece que tem um erro de digitação na propriedade _negociations_ de NegociationController, está _negocations.

Se não for isso, me manda o código completo de NegociationController e Negociations.

abraços!

Olá Vanessa, erro meu a falha de digitação (rsrs), mas mesmo assim não teve haver com o problema desse get.

class Negociations  {

    private _negociations:  Negociation[] = [];

    add(negociation: Negociation): void {
        this._negociations.push(negociation);
    }

    get lists(): Negociation[] {
        return [].concat(this._negociations);
    }
}
class NegociationController  {

    private _date: HTMLInputElement;
    private _quantity: HTMLInputElement;
    private _value: HTMLInputElement;
    private _negociations: Negociations;
    private _tableView: NegociationsView;
    private _messageView: MessageView;

    constructor()  {

        this._date = <HTMLInputElement>document.querySelector('#data');
        this._quantity = <HTMLInputElement>document.querySelector('#quantidade');
        this._value = <HTMLInputElement>document.querySelector('#valor');
        this._negociations = new Negociations();
        this._tableView = new NegociationsView('.tableView');
        this._messageView = new MessageView('#msgView');
        this._tableView.update(this._negociations);
    }

    adiciona(evt: Event) {
        evt.preventDefault();

        const negociation = new Negociation(
            new Date(this._date.value.replace(/-/g, '/')),
            parseInt(this._quantity.value, 10),
            parseFloat(this._value.value)
        );

        this._negociations.add(negociation);
        this._tableView.update(this._negociations);
        this._messageView.update('Added with success!');
    }
}

Pelo o que eu entendi, se tenho um retorno de algum tipo, não posso usar o get nos meus métodos.

Obs.: tentei formatar o código, mas esse editor é "estranho" .

solução!

Oii Tiago!!

Entendi o problema! E o erro que o compilador do TypeScrip lança, realmente não ajuda entender.O que acontece é que quando usamos o get na declaração de métodos, nós não podemos mais acessar ele como uma invocação método/função, ou seja, com os parênteses. E sim temos que entender que o get faz com que aquele método seja acessado como uma propriedade da classe, onde só chamamos o nome do método sem a invocação - os parênteses ().

Por exemplo:

class Pessoa {

    private _nome = '';

    get nome(): string {
        return this._nome
    }

}

const p = new Pessoa()

p.nome() //dá erro por causa do get - não posso chamar como se fosse um método

p.nome // é o correto,  acessa o método get como se fosse uma propriedade

Então neste caso, se você quiser transformar lists num get. Depois na NegociationsView, no .map você deve acessar lists sem o (), por exemplo:

${modelo.lists.map(negociacao => 

Fez sentido?

Veja se resolve!

abraços e bons estudos!!

Realmente era isso. Valeu!!