TypeScript POO Intermediário
Classes e modificadores
Em TypeScript, classes são a base da programação orientada a objetos. Além da sintaxe familiar do JavaScript, o TypeScript adiciona modificadores de acesso que controlam a visibilidade de propriedades e métodos: public (padrão), private (só a própria classe acessa) e protected (a classe e suas subclasses acessam).
O modificador readonly impede reatribuições após a inicialização, sendo útil para constantes de instância. TypeScript também oferece parameter properties: ao declarar um parâmetro no construtor com um modificador de acesso, o campo é criado e atribuído automaticamente, reduzindo boilerplate.
A palavra-chave implements garante que uma classe cumpra um contrato definido por uma interface. Isso permite programar para abstrações, aumentando a segurança e a legibilidade do código.
Neste card, vamos explorar como esses recursos trabalham juntos para criar classes robustas e expressivas.
Pontos-chave
publicé o padrão;privaterestringe o acesso à própria classe;protectedpermite acesso em subclasses.readonlysó pode ser atribuído no construtor ou na declaração.- Parameter properties declaram e inicializam campos diretamente no construtor, com modificadores.
implementsobriga a classe a seguir a interface, mas não herda implementação.- Modificadores são checados em tempo de compilação, não em tempo de execução.
interface Logger {
log(msg: string): void;
}
class ConsoleLogger implements Logger {
log(msg: string): void {
console.log(`[LOG] ${msg}`);
}
}
class ContaBancaria {
// Parameter properties: public readonly e private
constructor(
public readonly titular: string,
private saldo: number = 0
) {}
// Método público
public depositar(valor: number): void {
if (valor <= 0) throw new Error("Valor inválido");
this.saldo += valor;
}
// Método protected: acessível apenas na classe e subclasses
protected getSaldo(): number {
return this.saldo;
}
// Método público que usa o protected
public mostrarSaldo(): void {
console.log(`Saldo de ${this.titular}: R$ ${this.getSaldo().toFixed(2)}`);
}
}
class ContaPoupanca extends ContaBancaria {
constructor(titular: string, saldoInicial: number) {
super(titular, saldoInicial);
}
// Pode acessar getSaldo() porque é protected
public renderJuros(taxa: number): void {
const juros = this.getSaldo() * taxa;
this.depositar(juros);
}
}
// Uso
const logger = new ConsoleLogger();
const conta = new ContaPoupanca("Ana", 1000);
conta.depositar(500);
conta.renderJuros(0.01);
conta.mostrarSaldo();
logger.log("Operação concluída");
// Tentativas de acesso inválido (descomente para ver erros):
// conta.saldo = 0; // Erro: private
// conta.getSaldo(); // Erro: protected
// conta.titular = "Outro"; // Erro: readonly