Campos e Métodos Estáticos em TypeScript
Além dos campos e métodos comuns, uma classe pode ter campos e métodos estáticos. Campos e métodos estáticos não se referem a objetos individuais, mas à classe como um todo. Para acessar campos e métodos estáticos, utiliza-se o nome da classe.
Campos e métodos estáticos são definidos usando a palavra-chave static
:
class Person {
age: number;
name: string;
static retirementAge: number = 65;
static calculateYears(age: number): number {
return Person.retirementAge - age;
}
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
let tom = new Person("Tom", 36);
let years = Person.calculateYears(36);
console.log(Person.retirementAge);
console.log(`Years until retirement: ${years} years`);
Neste exemplo, a classe Person
define um campo estático retirementAge
, que armazena a idade de aposentadoria para objetos Person
. Como essa propriedade é comum a todos os objetos Person
, faz sentido torná-la estática, ou seja, compartilhada por toda a classe.
Para acessar este campo, utiliza-se o nome da classe:
console.log(Person.retirementAge);
Também foi definido um método estático calculateYears()
, que calcula o tempo restante até a aposentadoria (para simplificar, vamos supor que a idade fornecida é menor que a idade de aposentadoria). Da mesma forma, para chamar este método, usamos o nome da classe em vez do objeto:
let years = Person.calculateYears(36);
É importante notar que, em métodos estáticos, podemos acessar campos estáticos ou outros métodos estáticos da classe, mas não podemos acessar campos e métodos não estáticos nem usar a palavra-chave this
. Por exemplo, no seguinte caso, encontraremos um erro de compilação:
static calculateYears(): number {
return Person.retirementAge - this.age; // Erro: this.age refere-se a um campo não estático
}
Assim como campos e métodos comuns, campos e métodos estáticos podem ter modificadores de acesso:
class Person {
age: number;
name: string;
private static retirementAge: number = 65;
static calculateYears(age: number): number {
return Person.retirementAge - age;
}
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
Campos e métodos estáticos também podem ser herdados, o que permite acessá-los através do nome da classe derivada:
class Person {
age: number;
name: string;
static retirementAge: number = 65;
static calculateYears(age: number): number {
return Person.retirementAge - age;
}
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
class Employee extends Person {}
let years = Employee.calculateYears(36);
console.log(Employee.retirementAge);