Classes em TypeScript são uma maneira de criar objetos com propriedades e métodos que compartilham um comportamento comum.
class Animal {
constructor(name: string) {
this.name = name;
}
}- Você declara uma classe com a palavra-chave
class. - O construtor
constructoré um método especial usado para inicializar objetos.
const cat = new Animal('Whiskers');- Use a palavra-chave
newpara criar uma instância da classe. - O construtor é chamado quando você cria um novo objeto.
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
}- Defina propriedades diretamente na classe.
- Acesse essas propriedades com
this.
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name);
this.breed = breed;
}
}- Crie classes filhas que herdam de classes pai.
- Use
superno construtor da classe filha para chamar o construtor da classe pai.
class Animal {
speak(): void {
console.log(`${this.name} says hello.`);
}
}- Declare métodos dentro da classe.
- Chame esses métodos em instâncias da classe.
class MathUtil {
static square(x: number): number {
return x * x;
}
}- Use métodos estáticos para funções que não dependem de instâncias da classe.
- Acesse-os diretamente na classe, não em instâncias.
- TypeScript fornece modificadores de acesso como
public,privateeprotectedpara controlar a visibilidade de propriedades e métodos. - Estes modificadores só são aplicados no lado do Typescript.
Exemplo:
class Person {
private name: string;
constructor(name: string) {
this.name = name;
}
}Outra forma de declarar um atributo como sendo privado é através do `#`:
class Person {
#name: string;
constructor(name: string) {
this.name = name;
}
get name() {
return this.#name;
}
}class Circle {
private _radius: number;
get radius(): number {
return this._radius;
}
set radius(value: number) {
if (value >= 0) {
this._radius = value;
}
}
}- Use
getesetpara controlar a leitura e gravação de propriedades.
class Exemplo {
propriedade?: string; // Argumento opcional com '?'
outraPropriedade!: number; // Asserção de não nulo com '!'
readonly propriedadeSomenteLeitura: string = 'Este valor não pode ser alterado'; // Propriedade readonly
#campoPrivado: string = 'Este campo é privado'; // Campo privado com '#'
constructor(valor?: string) {
this.propriedade = valor; // Atribuição de valor para a propriedade opcional
this.outraPropriedade = 42; // Atribuição de valor para a propriedade não nula
// this.propriedadeSomenteLeitura = 'Novo valor'; // Erro, propriedade readonly não pode ser reatribuída
// this.#campoPrivado = 'Novo valor'; // Erro, campo privado não pode ser acessado diretamente
}
setCampoPrivado(novoValor: string) {
// Método para alterar o campo privado
this.#campoPrivado = novoValor;
}
}Aqui estão os detalhes sobre esses argumentos:
-
?(Opcional): O operador?após o nome do argumento indica que ele é opcional. Você pode ou não fornecer um valor quando criar uma instância da classe. -
!(Assertão de Não Nulo): O operador!é usado após o nome do argumento para indicar que você tem certeza de que a propriedade não seránullouundefined. Use isso quando tem certeza de que a propriedade estará definida antes de ser acessada. -
readonly: A palavra-chavereadonlyé usada para criar propriedades cujos valores não podem ser alterados após a inicialização. Eles devem ser definidos durante a criação da instância da classe. -
#(Campo Privado): O#é usado para criar campos privados. Campos privados não podem ser acessados ou modificados de fora da classe. Eles fornecem encapsulamento e ocultam os detalhes de implementação da classe.
interface Printable {
print(): void;
}
class Book implements Printable {
print(): void {
console.log('Printing the book...');
}
}- Classes podem implementar interfaces, garantindo que possuam métodos específicos.
12. Classes Abstratas:
abstract class Shape {
abstract area(): number;
}- Classes abstratas não podem ser instanciadas diretamente, mas fornecem uma base para outras classes.
- São usadas para definir um contrato ou interface que as classes filhas devem seguir.
- Classes abstratas podem conter métodos abstratos, que são declarados apenas, mas não têm implementação na classe abstrata.
- As classes filhas devem fornecer implementações para todos os métodos abstratos da classe abstrata.
Exemplo:
abstract class Shape {
abstract area(): number;
}
class Circle extends Shape {
constructor(private radius: number) {
super();
}
area(): number {
return Math.PI * this.radius * this.radius;
}
}
class Rectangle extends Shape {
constructor(private width: number, private height: number) {
super();
}
area(): number {
return this.width * this.height;
}
}
const circle = new Circle(5);
const rectangle = new Rectangle(4, 6);
console.log(circle.area()); // Calcula a área do círculo
console.log(rectangle.area()); // Calcula a área do retângulo- A classe
Shapeé abstrata e define um contrato para as classes filhas implementarem o métodoarea(). - As classes
CircleeRectangleherdam da classe abstrataShapee fornecem implementações para o métodoarea(). - As classes filhas são obrigadas a implementar todos os métodos abstratos definidos na classe abstrata.
- As classes abstratas são úteis quando você deseja garantir que todas as classes filhas tenham comportamentos específicos.