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

Problema ao utilizar toString como nomenclatura ao invés de paraTexto

Boa noite,

Bom, nas classes Negociacoes e Negociacao, decidi utilizar como nomenclatura toString() ao invés de paraTexto().

Exemplo de Negociacao.ts:

import { Imprimivel } from "./imprimivel";

export class Negociacao extends Imprimivel {
    constructor(
        private _data: Date,
        private _quantidade: number,
        private _valor: number
    ) {
        super()
    }

    // Métodos omitidos

    toString(): void {
        console.log('Negociação:')
        console.log(
            `Data: ${this.data}
            Quantidade: ${this.quantidade}
            Valor: ${this.valor}
            Volume: ${this.volume}
            `
        )
    }
}

Mesmo que Object.prototype já possua toString, isto funciona normalmente, pois o JavaScript irá procurar o método toString no prototype do objeto criado (Negociacao.prototype) e não precisará continuar buscando o método na cadeia de prototypes pois já o terá encontrado.

Segue implementação da função imprime em Util.ts:

import { Imprimivel } from "../models/imprimivel";

export function imprime(...negociacoes: Imprimivel[]) {
    negociacoes.forEach(negociacao => negociacao.toString())
}

A questão é que quando chamo o método imprime, dentro de NegociacaoController, posso passar praticamente qualquer coisa como argumento sem obter erros, provavelmente por toString ser um método de Object.prototype. Veja a chamada do método:

imprime(negociacao, this._negociacoes, 1, [], {}, '1', Symbol(), true)

Apesar do parâmetro da função imprime estar tipado como Imprimivel[], o TypeScript não reclama dos argumentos que passei. Isto provavelmente por todos eles "possuírem" o método toString através da cadeia de protótipos.

Os únicos argumentos que o TypeScript reclama são null e undefined:

file: 'file:///home/pedro/Dropbox/Cursos/Alura/TypeScript/alurabank/app/ts/controllers/NegociacaoController.ts'
severity: 'Error'
message: 'Argument of type 'null' is not assignable to parameter of type 'Imprimivel'.'
at: '47,17'
source: 'ts'

O erro é o mesmo para undefined.

Ok, entendo que os outros argumentos que foram "aceitos", "possuem" o método toString (inclusive os primitivos através de autoboxing), porém eles não são do tipo Imprimivel, por isso, no meu modo de ver, o TypeScript não deveria aceitar estes argumentos.

Talvez eu esteja falando besteira, mas este é um comportamento esperado do TypeScript?

1 resposta
solução!

Se o parâmetro tiver toString isso já basta para ter o mesmo shape da interface sem implementa-la. TypeScript não é Java.