Estou olhando para a implementação de membros privados no TypeScript e acho um pouco confuso. O Intellisense não permite acessar um membro privado, mas em JavaScript puro, está tudo lá. Isso me faz pensar que o TS não implementa membros privados corretamente. Alguma ideia?
class Test{
private member: any = "private member";
}
alert(new Test().member);
javascript
typescript
Sean Feldman
fonte
fonte
Respostas:
Assim como com a verificação de tipo, a privacidade dos membros só é imposta no compilador.
Uma propriedade privada é implementada como uma propriedade regular e o código fora da classe não tem permissão para acessá-la.
Para tornar algo realmente privado dentro da classe, não pode ser um membro da classe, seria uma variável local criada dentro de um escopo de função dentro do código que cria o objeto. Isso significaria que você não pode acessá-lo como um membro da classe, ou seja, usando a
this
palavra - chave.fonte
this
palavra - chave.JavaScript oferece suporte a variáveis privadas.
No TypeScript, isso seria expresso assim:
EDITAR
Essa abordagem só deve ser usada PARCIALMENTE onde for absolutamente necessária. Por exemplo, se você precisar armazenar uma senha temporariamente.
Existem custos de desempenho para usar este padrão (irrelevante de Javascript ou Typescript) e só deve ser usado quando for absolutamente necessário.
fonte
var _this
para uso em funções com escopo? Por que você teria escrúpulos em fazer isso no âmbito da classe?Uma vez que o suporte para WeakMap esteja mais amplamente disponível, há uma técnica interessante detalhada no exemplo # 3 aqui .
Ele permite dados privados E evita os custos de desempenho do exemplo de Jason Evans, permitindo que os dados sejam acessíveis a partir de métodos de protótipo em vez de apenas métodos de instância.
A página MDN WeakMap vinculada lista o suporte do navegador no Chrome 36, Firefox 6.0, IE 11, Opera 23 e Safari 7.1.
fonte
protected
parâmetros? : DComo o TypeScript 3.8 será lançado, você poderá declarar um campo privado que não pode ser acessado ou mesmo detectado fora da classe que o contém .
Os campos privados começam com
#
caracteresObserve que esses campos privados serão diferentes dos campos marcados com a
private
palavra - chaveRef. https://devblogs.microsoft.com/typescript/announcing-typescript-3-8-beta/
fonte
Agradecimentos a Sean Feldman pelo link para a discussão oficial sobre este assunto - veja sua resposta no link.
Li a discussão à qual ele vinculou e aqui está um resumo dos pontos-chave:
this
sem algum tipo de solução alternativa@private
minificadores so que reconheçam que a anotação pode reduzir efetivamente os nomes dos métodosContra-argumentos gerais para adicionar suporte de visibilidade no código emitido:
fonte
No TypeScript, as funções privadas são acessíveis apenas dentro da classe. Gostar
E mostrará um erro quando você tentar acessar um membro privado. Aqui está o exemplo:
fonte
Sei que esta é uma discussão mais antiga, mas ainda pode ser útil compartilhar minha solução para o problema das variáveis e métodos supostamente privados em um TypeScript "vazando" para a interface pública da classe JavaScript compilada.
Para mim, esse problema é puramente cosmético, ou seja, é tudo sobre a desordem visual quando uma variável de instância é exibida no DevTools. Minha correção é agrupar declarações privadas dentro de outra classe que é então instanciada na classe principal e atribuída a uma
private
variável (mas ainda visível publicamente em JS) com um nome como__
(sublinhado duplo).Exemplo:
Quando a
myClass
instância é visualizada no DevTools, em vez de ver todos os seus membros "privados" misturados com os realmente públicos (o que pode ficar muito confuso visualmente em código da vida real devidamente refatorado), você os vê agrupados ordenadamente dentro da__
propriedade recolhida :fonte
Esta é uma abordagem reutilizável para adicionar propriedades privadas adequadas:
Digamos que você tenha uma classe em
Client
algum lugar que precise de duas propriedades privadas:prop1: string
prop2: number
Abaixo está como você o implementa:
E se você só precisa de uma única propriedade privada, fica ainda mais simples, porque você não precisaria definir nenhuma
ClientPrivate
nesse caso.Vale a pena notar que, na maioria das vezes, a classe
Private
oferece apenas uma assinatura bem legível, enquanto o uso direto deWeakMap
não.fonte