Private Class Fields
A versão 3.8 adicionou os campos privados, que é uma maneira de declarar
que um campo de uma classe é inacessível fora daquela classe, incluindo subclasses.
Por exemplo, a classe Pessoa abaixo não permite que ninguém usando uma
instância da classe leia o primeiroNome, sobrenome, e o prefixo.
// Uma pergunta comum que fazemos é "Porque você usaria isso no lugar da
palavra-chave 'private' dentro de uma classe?" - vamos fazer uma
comparação sobre para ver como isso funciona após a 3.8:
class Pessoa {
#primeiroNome: string;
#sobrenome: string;
#prefixo: string;
constructor(primeiroNome: string, sobrenome: string, prefixo: string) {
this.#primeiroNome = primeiroNome;
this.#sobrenome = sobrenome;
this.#prefixo = prefixo;
}
cumprimentar() {
// Na Islândia é preferível que usemos o nome completo ao invés de [prefixo] [sobrenome]
// https://www.w3.org/International/questions/qa-personal-names#patronymic
if(navigator.languages[0] === "is") {
console.log(`Góðan dag, ${this.#primeiroNome} ${this.#sobrenome}`);
} else {
console.log(`Olá, ${this.#prefixo} ${this.#sobrenome}`);
}
}
}
let jeremias = new Pessoa("Jeremias", "Beremias", "Sr.");
// Você não pode acessar nenhum dos campos dessa classe de fora dela:
// Por exemplo, isso não funciona:
console.log(jeremias.#primeiroNome);
// Nem isso:
console.log("Sobrenome de Pessoas:", jeremias["#sobrenome"]);
// A referência de private no TypeScript só existe no nível de tipos, o que
significa que você só pode confiar nisso. Agora com os campos
privados fazendo parte da linguagem JavaScript, você pode então
garantir de uma forma melhor a visibilidade no seu código.
Nós não planejamos descontinuar a palavra-chave `private`
no TypeScript, então os seus códigos ja existentes vão continuar
a funcionar, mas agora você pode escrever código de uma forma mais
proxima da linguagem JavaScript.
Você pode aprender mais sobre campos de classes na proposta da tc39
https://github.com/tc39/proposal-class-fields/
e nas notas de lançamentos beta:
https://devblogs.microsoft.com/typescript/announcing-typescript-3-8-beta/#ecmascript-private-fields
class Cachorro {
private _nome: string;
constructor(nome: string) {
this._nome = nome;
}
}
let rex = new Cachorro("Rex");
// Não permite que você acesse através da notação de ponto
rex._nome = "Caramelo";
// Mas permite que seja acessado através da notação de colchetes.
rex["_nome"] = "Bidu";