A programação orientada à objetos no JavaScript é originalmente realizada através de funções e herança prototípica. Com o advento do ECMAScript 2015, coloquialmente chamado de “ES6”, foi adicionada a palavra chave class, agora nos permitindo criar classes de maneira similar à linguagens como C++, C#, e Java.
O TypeScript também tem suporte a declaração de classes através da palavra chave class
. Vamos ver um exemplo:
class Forma {
nome: string;
constructor(oNome: string) {
this.nome = oNome;
}
}
O exemplo acima define uma classe chamada de Forma
, que tem como atributo a propriedade nome
. A função constructor()
é chamada quando você construir um objeto baseado na classe e atribui um nome à forma.
O acesso de membros da classe é por padrão public
, se nada for definido explicitamente. Entao podemos instanciar um objeto e acessar a propriedade nome
diretamente:
let retang: Forma = new Forma("Retangulo");
console.log(`O nome da forma é ${retang.nome}`);
A expressão acima primeiro declara uma variável do tipo Forma
e atribui ao seu valor uma nova instância de Forma
, com o nome Retangulo. Note que a string Retangulo é passada como argumento para o constructor
, que por si atribui o nome do objeto this.nome
.
O console.log
imprime uma mensagem que inclui acesso ao nome da Forma diretamente, sem passar por um método getter.
Vamos adicionar duas propriedades à classe Forma: largura
e altura
. Ambas devem ser do tipo number
.
class Forma {
nome: string;
largura: number;
altura: number;
constructor(oNome: string, aLargura: number, aAltura: number) {
this.nome = oNome;
this.largura = aLargura;
this.altura = aAltura;
}
}
Agora podemos fazer um método para calcular a área da forma:
class Forma {
// ...
public obterArea(): number {
return this.largura * this.altura;
}
}
Como já mencionado, o acesso dos membros de uma classe em TypeScript é public
por padrão, mas o exemplo acima o define explicitamente. Acesso público significa que o membro pode ser referenciado por fora da classe. Isso é o oposto do acesso privado (private
), em que é proibido a referência do membro de fora da classe ou instância.
O método não tem nenhum parâmetro porque os valores necessários para calcular a área já são parte dos atributos do objeto.
O tipo do valor de retorno do método obterArea
é explicitamente definido como number
, mas poderia ser omitido e o compilador deduziria o tipo ao analizar a expressão de retorno.
Vamos testar o método obterArea
:
let retang: Forma = new Forma("Retangulo", 3, 4);
console.log(`A area do retângulo é ${retang.obterArea()}`);
Saída:
A area do retângulo é 12
Para não expor os atributos largura
e altura
do objeto ao mundo de fora, que tal redefinir essas propriedades com acesso privado?
class Forma {
// ...
private largura: number;
private altura: number;
// ...
}
Dessa maneira, se o usuário do objeto tentar referenciar retang.largura
, o compilador irá emitir um erro dizendo que o acesso não é permitido devido a propriedade ser privada:
Property 'largura' is private and only accessible within class 'Forma'.
Para aprender mais sobre o TypeScript, assista às aulas do NBK Mundo Tech:
Nos vemos lá!