Welche Zugriffsmodifikatoren werden impliziert, wenn sie nicht angegeben werden?

138

Welche Zugriffsmodifikatoren werden für all die verschiedenen Konzepte, die Zugriffsmodifikatoren unterstützen, wie Felder, Eigenschaften, Methoden und Klassen, impliziert, wenn sie nicht angegeben werden?

Sam
quelle
@basarat, es ist lange her, dass ich TypeScript verwendet habe, daher ist es schwer zu merken, wie es heutzutage funktioniert! Soweit ich mich erinnere, sah Ihre Antwort vernünftig aus, aber ich fand sie nicht maßgeblich genug, um sie als richtig zu markieren. Beruht Ihre Antwort auf Ihren Erfahrungen mit der Sprache oder basiert sie auf Informationen in den Spezifikationen?
Sam
basierend auf der Spezifikation github.com/Microsoft/TypeScript/blob/master/doc/spec.md
basarat
1
Um diese Frage und Antwort zu klären, sollte in der Frage ein Typoskript angegeben werden, um dies zu verdeutlichen. Es gibt ein Typoskript-Tag, aber das ist der einzige Hinweis darauf, dass wir nicht über Scala, Java, C #, C ++, ...
sprechen

Antworten:

216

Alles in a classist, publicwenn nicht angegeben. Alles in a moduleist privat, sofern kein exportSchlüsselwort verwendet wird.

Basarat
quelle
6
Für Leute, die mit einem Starter-Kit spielen. Einige von ihnen werden mit tslint geliefert und es kann sehr verwirrend werden. Wenn diese Meldung angezeigt wird default access modifier on member/method not allowed Überprüfen Sie tslint.json, ob der Standardmodifikator oder der implizite Zugriffsmodifikator zulässig ist.
Visheshd
1
Wäre es möglich, einen Schritt vor dem Transpilieren zu verwenden, um automatisch zuzuweisen private?
Qwerty
-4

Dem stimme ich nicht zu

Alles in einer Klasse ist öffentlich, wenn nicht angegeben.

Alles ist öffentlich, auch wenn privat verwendet wird. Schauen Sie sich einfach den transpilierten Code an. Private kommentierte Methoden werden öffentlich verfügbar sein. Nur das Transpilieren wirft Fehler auf. Sowohl öffentliche als auch private werden in konvertiert<Object>.prototype.funcName

Jens Peters
quelle
24
Ja, das ist ein guter Punkt. Meine Frage war jedoch which access modifiers are implied when not specifiedeher als can my code be accessed when an access modifier is not specified. Zugriffsmodifikatoren sind eher ein TypeScript-Konzept als ein JavaScript-Konzept. Ich denke also, dass die Antwort von @ basarat das angesprochen hat, was ich in der Frage gemeint habe, und im Kontext der Frage richtig zu sein scheint. Vielleicht gibt es etwas Raum, um den Wortlaut in der Frage und Antwort zu disambiguieren.
Sam
So funktioniert TS. Es kompiliert Ihren Code, egal ob er vom TS-Standpunkt aus "korrekt" ist. Dies impliziert alles in TS ohne Ausnahme von Klassen, aber der Hauptpunkt ist, wenn Sie TS-Warnungen respektieren - das werden Sie nicht auf Eigenschaften zugreifen, die als privat markiert sind.
Andrew Bogdanov
3
Ich kann mir keine Sprache vorstellen, in der etwas tatsächlich privat ist. In C # können Sie durch Reflexion leicht auf jedes private Feld gelangen. In untergeordneten Sprachen wie C oder C ++ können Sie auf private Felder zugreifen, indem Sie einfach Zeiger verschieben. Abgesehen von den Sicherheitsvorkehrungen auf Betriebssystemebene wie DEP und verschlüsseltem Speicher sind Zugriffsmodifikatoren nur vom Compiler bereitgestellte Unterstützung, um Ihnen beim Schreiben von besserem Code zu helfen. ...Richtig?
Pbarranis
@pbarranis private JavaScript-Felder sind tatsächlich privat und es gibt keine Möglichkeit, innerhalb der JavaScript-Laufzeit darauf zuzugreifen.
Yogu