Herança de Classes no TypeScript

in #typescript5 years ago

A palavra-chave class, introduzida no ECMAScript 2015, nos permite definir uma classe em JavaScript. O TypeScript também tem suporte ao paradigma. Um dos elementos da programação orientada à objetos é a herança de classes para reutilizar o código. No JavaScript tradicional, a herança é feita através de protótipos. Já com a palavra-chave class, podemos fazer a herança através da palavra-chave extends.

Vamos supor que temos uma base classe chamada Individuo. Vamos simplificar o nosso exemplo e considerar mais duas classes: um individuo poderia ser um estudante ou um funcionário de uma empresa. Por causa disso, podemos usar herança e definir que:

Um Estudante é um Individuo
Um Funcionario é um Individuo

Então a base classe é Individuo e as classes derivadas são Estudante e Funcionario. O primeiro é também chamado de superclasse e os segundos são subclasses.

Vamos aprender com um código. Primeiro definimos a base classe:

class Individuo {
  nome: string;
  constructor(oNome: string) {
    this.nome = oNome;
  }
}

Agora, para herdarmos da base classe, usamos a palavra-chave extends logo após o nome dela. Depois segue com o nome da classe derivada:

class Estudante extends Individuo {
}

class Funcionario extends Individuo {
}

Não definimos nenhum membro para as classes derivadas, mas ambas irão herdar a propriedade nome e o constructor de Individuo.

Podemos então adicionar propriedades e métodos específicos para cada subclasse. Por exemplo, um Estudante tem uma disciplina de estudo e um funcionário tem um salario.

class Estudante extends Individuo {
  disciplina: string;

  constructor(oNome: string, aDisciplina: string) {
    super(oNome);
    this.disciplina = aDisciplina;
  }
}

class Funcionario extends Individuo {
  salario: number;

  constructor(oNome: string, oSalario: number) {
    super(oNome);
    this.salario = oSalario;
  }
}

No exemplo acima, precisamos adicionar um novo constructor à cada classe derivada para poder iniciar as propriedades específicas de cada classe. Note que podemos reutilizar o código do constructor da base classe Individuo com a chamada de super.

É importante ressaltar que super deve ser chamado para iniciar os valores compartilhados através da base classe e que não se deve referenciar this. no corpo do constructor antes da chamada de super().

Vamos testar nossas classes:

let fJoao: Funcionario = new Funcionario("Joao", 123);
let eAna: Estudante = new Estudante("Ana", "Arquitetura");

Note que também podemos criar uma variável do tipo da base classe e ainda armazenar tanto um Estudante como um Funcionario:

let individuo: Individuo = fJoao;
individuo = eAna;

O código acima funciona porque um Funcionario é um Individuo e um Estudante também é um Individuo.

Para aprender mais sobre o TypeScript, assista às aulas do NBK Mundo Tech:

Nos vemos lá!