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?