In TypeScript kann das const
Schlüsselwort nicht zum Deklarieren von Klasseneigenschaften verwendet werden. Dies führt dazu, dass der Compiler einen Fehler mit "Ein Klassenmitglied kann das Schlüsselwort 'const' nicht haben."
Ich muss im Code klar angeben, dass eine Eigenschaft nicht geändert werden sollte. Ich möchte, dass die IDE oder der Compiler einen Fehler macht, wenn ich versuche, der Eigenschaft einen neuen Wert zuzuweisen, sobald sie deklariert wurde. Wie erreicht ihr das?
Ich verwende derzeit eine schreibgeschützte Eigenschaft, bin jedoch neu in Typescript (und JavaScript) und frage mich, ob es einen besseren Weg gibt:
get MY_CONSTANT():number {return 10};
Ich benutze Typoskript 1.8. Vorschläge?
PS: Ich verwende jetzt Typoskript 2.0.3, also habe ich Davids Antwort akzeptiert
quelle
export
Schlüsselwort sowohl vorclass
als auchpublic static
vor demreadonly
Schlüsselwort hinzufügen . Siehe hier: stackoverflow.com/a/22993349export
(externen Module) und daspublic
Schlüsselwort haben nichts mit dieser Frage / Antwort zu tun, aber beim Thema Explizit fällt es mir persönlich sehr leicht zu sagen, dass ein Mitglied öffentlich ist, wenn das Schlüsselwort nicht vorhanden ist. Ich kümmere mich aus diesem Grund nicht darum und weil es mehr Rauschen hinzufügt und unnötig tippt. Es unterscheidet die öffentlichen Mitglieder auch stärker von denen, die alsprivate
oder gekennzeichnet sindprotected
. Wie auch immer, nur meine Meinung :)static readonly myReadOnlyProperty
wenn die Klasse mit deklariert istexport default class { ... }
? Versucht this.myVar, self.myVar, statisch, Standard ... funktioniert nicht ... (EDIT: default.myVar scheint die Lösung zu sein, aber ichKonstanten können außerhalb von Klassen deklariert und innerhalb Ihrer Klasse verwendet werden. Ansonsten ist die
get
Eigenschaft eine schöne Problemumgehungquelle
get
Eigentum in Ihrem Fall sehr angemessenexport const
und dann aus einer anderen Datei importieren. Wäre allerdings ziemlich einfach zu testen. Deklarieren Sie einfach eineconst
in einer Datei und versuchen Sie, sie in einer anderen Datei ohne Export / Import oder über die Browserkonsole zu verwenden.Sie können Eigenschaften mit dem
readonly
Modifikator in Ihrer Deklaration markieren :@see TypeScript Deep Dive Buch - Readonly
quelle
Winkel 2 Bietet eine sehr schöne Funktion, die als undurchsichtige Konstanten bezeichnet wird. Erstellen Sie eine Klasse und definieren Sie alle Konstanten dort mit undurchsichtigen Konstanten.
Injizieren Sie es in Anbietern in app.module.ts
Sie können es für alle Komponenten verwenden.
EDIT für Angular 4:
Für Angular 4 lautet das neue Konzept Injection Token & Opaque Token ist in Angular 4 veraltet.
Injection Token Fügt Funktionen zusätzlich zu undurchsichtigen Token hinzu. Es ermöglicht das Anhängen von Typinformationen an das Token über TypeScript-Generika sowie Injection Token, sodass @Inject nicht mehr hinzugefügt werden muss
Beispielcode
Winkel 2 Verwenden undurchsichtiger Token
Winkel 4 Verwenden von Injektionstoken
Injektionsmarker werden logisch über undurchsichtigen Token entworfen und undurchsichtige Token sind in Winkel 4 veraltet.
quelle
Verwenden Sie entweder den Modifikator readOnly mit der Konstante, die deklariert werden muss, oder deklarieren Sie eine Konstante außerhalb der Klasse und verwenden Sie sie speziell nur in der erforderlichen Klasse mit dem Operator get.
quelle
Hierfür können Sie den
readonly
Modifikator verwenden.readonly
Objekteigenschaften, die nur während der Initialisierung des Objekts zugewiesen werden können.Beispiel in Klassen:
Beispiel in Objektliteralen:
Es ist auch wichtig zu wissen, dass der
readonly
Modifikator ein reines Typoskript-Konstrukt ist und wenn der TS zu JS kompiliert wird, das Konstrukt im kompilierten JS nicht vorhanden ist. Wenn wir schreibgeschützte Eigenschaften ändern, warnt uns der TS-Compiler davor (es ist gültiges JS).quelle
Für mich funktioniert keine der früheren Antworten. Ich musste meine statische Klasse in enum konvertieren. So was:
Dann füge ich in meiner Komponente eine neue Eigenschaft hinzu, wie in anderen Antworten vorgeschlagen
Dann verwende ich es in der Vorlage meiner Komponente so
EDIT: Entschuldigung. Mein Problem war anders als bei OPs. Ich lasse das immer noch hier, wenn jemand das gleiche Problem hat wie ich.
quelle