Quali modificatori di accesso sono impliciti quando non specificati?


138

Per tutti i diversi concetti che supportano i modificatori di accesso, come campi, proprietà, metodi e classi, quali modificatori di accesso sono impliciti se non specificati?


@basarat, è da tanto tempo che non uso TypeScript, quindi è difficile ricordare come funziona in questi giorni! Per quanto mi ricordo, la tua risposta sembrava ragionevole, ma non pensavo che fosse abbastanza autorevole per me contrassegnarlo come corretto. La tua risposta è basata sulla tua esperienza con la lingua o proviene dalle informazioni nelle specifiche?
Sam,


1
Al fine di chiarire questa domanda e risposta, il dattiloscritto avrebbe dovuto essere specificato nella domanda per chiarire. C'è un tag dattiloscritto, ma questa è l'unica indicazione di cui non stiamo discutendo scala, java, C #, C ++, ....
absmiths

Risposte:


216

Tutto in a classè publicse non specificato. Tutto in un moduleè privato a meno che non exportvenga utilizzata una parola chiave.


6
Per le persone che giocano con uno starter kit. Alcuni di loro vengono spediti con tslint e può diventare molto confuso. Quando si vede questo messaggio default access modifier on member/method not allowed Controllare tslint.jsonper consentire l'accesso di default o implicita modificatore.
visheshd,

1
Sarebbe possibile utilizzare un passaggio pre-transpile per assegnare automaticamente private?
Qwerty,

-4

Non sono d'accordo

Tutto in una classe è pubblico se non specificato.

Tutto è pubblico, anche se viene utilizzato privato. Guarda il codice traspilato. I metodi con annotazioni private saranno disponibili al pubblico. Solo la traspilazione genererà errori. Sia pubblici che privati ​​verranno convertiti in<Object>.prototype.funcName


24
Sì, questo è un buon punto. Tuttavia, la mia domanda era which access modifiers are implied when not specifiedpiuttosto che can my code be accessed when an access modifier is not specified. I modificatori di accesso sono un concetto TypeScript anziché un concetto JavaScript. Quindi penso che la risposta di @ basarat abbia affrontato ciò che intendevo nella domanda e sembra essere corretta nel contesto della domanda. Forse c'è un po 'di spazio per chiarire le parole nella domanda e nella risposta.
Sam,

Ecco come funziona TS, compilerà il tuo codice indipendentemente dal fatto che sia "corretto" dal punto di vista TS, questo implica tutto in TS senza eccezioni per le classi, ma il punto principale è se rispetti gli avvisi TS - non lo farai accedere alle proprietà contrassegnate come private.
Andrew Bogdanov,

3
Non riesco a pensare a nessuna lingua in cui qualcosa è in realtà privato. In C # puoi facilmente accedere a qualsiasi campo privato attraverso la riflessione. In linguaggi di livello inferiore come C o C ++, puoi accedere ai campi privati ​​semplicemente spostando i puntatori. A parte le garanzie a livello di sistema operativo, come DEP e memoria crittografata, i modificatori di accesso sono solo assistenza fornita dal compilatore per aiutarti a scrivere codice migliore. ...Destra?
pbarranis,

I campi JavaScript privati ​​di @pbarranis sono in realtà privati ​​e non è possibile accedervi dall'interno del runtime JavaScript.
Yogu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.