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?