Quais modificadores de acesso estão implícitos quando não especificados?

138

Para todos os diferentes conceitos que suportam modificadores de acesso, como campos, propriedades, métodos e classes, quais modificadores de acesso estão implícitos se não forem especificados?

Sam
fonte
@basarat, já faz muito tempo desde que eu usei o TypeScript, por isso é difícil lembrar como funciona hoje em dia! Tanto quanto me lembro, sua resposta parecia razoável, mas não achei que fosse autoritário o suficiente para marcá-la como correta. Sua resposta é baseada na sua experiência com o idioma ou é de informações nas especificações?
Sam
com base na especificação github.com/Microsoft/TypeScript/blob/master/doc/spec.md
basarat
1
Para esclarecer essa pergunta e resposta, o texto datilografado deveria ter sido especificado na pergunta para esclarecer. Há uma tag texto datilografado, mas essa é a única indicação que nós não estamos discutindo Scala, Java, C #, C ++, ....
absmiths

Respostas:

216

Tudo em a classé publicse não for especificado. Tudo em um moduleé privado, a menos que a exportpalavra-chave seja usada.

basarat
fonte
6
Para pessoas que jogam com um kit inicial. Alguns deles são enviados com tslint e isso pode ficar muito confuso. Quando você vir esta mensagem default access modifier on member/method not allowed Marque tslint.jsonpara permitir o modificador de acesso implícito ou padrão.
visheshd
1
Seria possível usar uma etapa de pré-transpilação para atribuir automaticamente private?
Qwerty
-4

Eu não concordo que

Tudo em uma classe é público, se não especificado.

Tudo é público, mesmo que seja usado privado. Basta olhar para o código transpilado. Os métodos anotados privados estarão disponíveis ao público. Somente a transpilação gerará erros. Público e privado serão convertidos em<Object>.prototype.funcName

Jens Peters
fonte
24
Sim, este é um bom ponto. No entanto, minha pergunta foi which access modifiers are implied when not specifiedmais do que can my code be accessed when an access modifier is not specified. Modificadores de acesso são um conceito TypeScript e não um conceito JavaScript. Então, acho que a resposta do @ basarat abordou o que eu quis dizer na pergunta e parece estar correta no contexto da pergunta. Talvez haja espaço para desambiguar a redação da pergunta e resposta.
25416 Sam
É assim que o TS funciona, ele compilará seu código, independentemente de estar "correto" do ponto de vista do TS, isso implica em tudo no TS, sem exceção das classes, mas o ponto principal é se você respeitar os avisos do TS - você não estar acessando propriedades marcadas como privadas.
Andrew Bogdanov
3
Não consigo pensar em nenhum idioma em que algo seja realmente privado. Em C #, você pode acessar facilmente qualquer campo privado através da reflexão. Em linguagens de nível inferior, como C ou C ++, você pode acessar campos privados apenas movendo os ponteiros. Além das salvaguardas no nível do SO, como DEP e memória criptografada, os modificadores de acesso são apenas assistência fornecida pelo compilador para ajudá-lo a escrever um código melhor. ...Certo?
Pbarranis
Os campos JavaScript privados @pbarranis são realmente privados e não há como acessá-los no tempo de execução do JavaScript.
Yogu 22/11/19