Classes em TypeScript: quem pode acessar cada membro

Classes em TypeScript

Classes em TypeScript: modificadores, readonly, abstract, implements | We.Inc

Campos, construtores, parameter properties, public, protected, private e #private, readonly, abstract e implements. Teste quem consegue acessar cada membro em uma matriz interativa.

Uma classe TypeScript é uma classe JavaScript com campos tipados e regras de acesso. Membros public podem ser acessados de qualquer lugar, os protected dentro da classe e das subclasses, e os private só dentro da própria classe. Essas três verificações existem apenas em tempo de compilação. Um campo #name é privado também no JavaScript em execução, e readonly bloqueia escritas depois do construtor.

Palavras-chave de classe e o que elas fazem

Escolha um modificador e a matriz mostra cinco formas de o código chegar a esse membro, com o resultado do tsc para cada uma. A linha dos colchetes é a que surpreende: os modificadores de tempo de compilação podem ser contornados com uma chave em string, enquanto um campo # não pode.

Perguntas frequentes

Qual é a diferença entre private e #private?

private é uma verificação do TypeScript. Ela some da saída, e obj["secret"] ainda compila e lê o valor. Um campo #secret é um campo privado do JavaScript: nenhuma chave em string chega até ele, e código fora da classe não consegue lê-lo em tempo de execução.

O que são parameter properties?

Um atalho que declara e atribui um campo a partir de um parâmetro do construtor. Escrever constructor(private readonly id: string) {} cria um campo id private readonly sem precisar de corpo. O prefixo pode ser public, protected, private ou readonly.

implements muda os tipos dentro da minha classe?

Não. implements só verifica se a classe pronta se encaixa na interface. Os parâmetros dos métodos continuam precisando das próprias anotações; deixar uma de fora no modo strict gera um erro de any implícito, mesmo que a interface já indique o tipo.

Por que o TypeScript diz que uma propriedade não tem inicializador?

strictPropertyInitialization, que o strict ativa, exige que todo campo declarado receba valor na declaração ou no construtor. Dê um valor a ele, torne-o opcional ou adicione ! depois do nome se outra coisa o definir antes do uso.

Quando devo usar uma classe abstrata em vez de uma interface?

Use uma classe abstrata quando as subclasses devem compartilhar código de verdade, como um método que chama um hook abstrato. Uma interface não carrega código e uma classe pode implementar várias, então ela serve para descrever formatos.

Campos, construtores e parameter properties

Privacidade em tempo de compilação versus em tempo de execução

Classes e interfaces trabalham juntas

Padrões de classe na prática

Parameter properties e um campo #

O construtor declara dois campos na lista de parâmetros. O cache é um campo #, então nada fora da classe consegue lê-lo ou limpá-lo.

Uma base abstrata com override

describe é código compartilhado; area é o hook que cada forma precisa fornecer. Com noImplicitOverride ligado, a palavra-chave override é obrigatória em area na classe Circle.

implements verifica, não infere

A interface garante que a classe tenha send com o formato certo, mas o parâmetro ainda precisa da própria anotação de tipo.

Sem restrições. Omitir o modificador significa a mesma coisa.

Dentro dos próprios métodos de Account

Dentro de um método de Savings

De fora, com ponto

De fora, com chave em string

De fora, atribuindo um novo valor

Aberto para a classe e as subclasses. Uma chave em string ainda passa pela verificação, porque é só uma regra de tipo.

Dentro dos próprios métodos de Account

Dentro de um método de Savings

De fora, com ponto

De fora, com chave em string

De fora, atribuindo um novo valor

Fechado até para subclasses, mas só durante a verificação de tipos. A forma com colchetes compila e o valor pode ser lido em tempo de execução.

Dentro dos próprios métodos de Account

Dentro de um método de Savings

De fora, com ponto

De fora, com chave em string

De fora, atribuindo um novo valor

Um campo privado do JavaScript. Nenhuma chave em string o nomeia, então toda rota externa falha, e o motor aplica a mesma regra em tempo de execução.

Dentro dos próprios métodos de Account

Dentro de um método de Savings

De fora, com ponto

De fora, com chave em string

De fora, atribuindo um novo valor

Qualquer um pode ler; ninguém pode atribuir depois da construção, nem mesmo os métodos da própria classe.

Dentro dos próprios métodos de Account

Dentro de um método de Savings

De fora, com ponto

De fora, com chave em string

De fora, atribuindo um novo valor

Matriz de acesso a membros

Escolha um modificador

Acesso a um membro {v}

Usado de

Código

Resultado do tsc

Compila

Comece grátis · Sem cartão de crédito

Relacionados: Guias

Produto

Para quem é

Recursos

Recursos

Empresa

Mapa do site