Antes de assistir a essa aula (que explica e usa o Generics), testei utilizando o tipo Any lá na View e funcionou.
export class View {
private element: HTMLElement
constructor(seletor: string) {
this.element = document.querySelector(seletor)
}
template(model: any): string {
throw Error('Classe filha precisa implementar o método template')
}
update(model: any): void {
const template = this.template(model)
this.element.innerHTML = template
}
}
Exemplo de extensão:
import { View } from './view.js'
export class MensagemView extends View {
template(model: string): string {
return `
<p class="alert alert-info">${model}</p>
`
}
}
O código vai rodar de boa... Ou seja, a "interface" estaria não fixando mais o tipo para esses dois métodos. Basta apenas que garanta que envie o tipo de dado correto...
Entretanto, entendo que dessa forma, perderia um pouco do controle do tipo para quem for utilizar indiretamente dessa "interface", como lá no controller. Vejam:
Exemplo da vulnerabilidade que o any causaria lá no negociacao-controller.ts:
adiciona(): void {
const negociacao = this.criaNegociacao()
negociacao.data.setDate(12)
this.negociacoes.adiciona(negociacao)
this.negociacoesView.update('Estou enviando um texto, em vez do objeto this.negociacoes')
this.mensagemView.update('Negociação adicionada com sucesso')
this.limparFormulario()
}
Ali no update precisa enviar um objeto de negociacoes, mas a estrutura está permitindo enviar qualquer coisa (um any). Daí, vai "compilar sem erros", só que vai dar erro em tempo de execução, pois na hora de tentar acessar os atributos do objeto, não vai encontrar os dados, ou seja, no caso, essa string que enviei não tem o método .lista()... logo, estouraria um erro.
O mesmo aconteceria para MensagemView, poderia chama erroneamente, por exemplo, assim:
this.mensagemView.update(negociacao)
Ia "compilar" sem erros, mas não conseguiria exibir a mensagem como desejado...
Por aí, vai.
Por favor, fiquem a vontade para me corrigir e/ou complementar.
Valeu