Was ist der beste und bequemste Weg, um ein Singleton-Muster für eine Klasse in TypeScript zu implementieren? (Sowohl mit als auch ohne verzögerte Initialisierung).
singleton
typescript
Maja
quelle
quelle
export default new Singleton()
?Seit TS 2.0 können wir Sichtbarkeitsmodifikatoren für Konstruktoren definieren , sodass wir jetzt Singletons in TypeScript erstellen können, wie wir es von anderen Sprachen gewohnt sind.
Beispiel gegeben:
Vielen Dank an @Drenai für den Hinweis, dass Sie beim Schreiben von Code mit dem rohen kompilierten Javascript keinen Schutz vor mehrfacher Instanziierung haben, da die Einschränkungen von TS verschwinden und der Konstruktor nicht ausgeblendet wird.
quelle
Der beste Weg, den ich gefunden habe, ist:
So verwenden Sie es:
https://codebelt.github.io/blog/typescript/typescript-singleton-pattern/
quelle
Der folgende Ansatz erstellt eine Singleton-Klasse, die genau wie eine herkömmliche Klasse verwendet werden kann:
Jede
new Singleton()
Operation gibt dieselbe Instanz zurück. Dies kann jedoch vom Benutzer unerwartet sein.Das folgende Beispiel ist für den Benutzer transparenter, erfordert jedoch eine andere Verwendung:
Verwendung:
var obj = Singleton.getInstance();
quelle
new Class(...)
Syntax implementieren .Ich bin überrascht, das folgende Muster hier nicht zu sehen, das eigentlich sehr einfach aussieht.
Verwendung
quelle
Shout
Sie können hierfür Klassenausdrücke verwenden (ab 1.6 glaube ich).
oder mit dem Namen, wenn Ihre Klasse intern auf ihren Typ zugreifen muss
Eine andere Möglichkeit besteht darin, eine lokale Klasse in Ihrem Singleton mit einigen statischen Elementen zu verwenden
quelle
Fügen Sie jeder Klasse die folgenden 6 Zeilen hinzu, um sie zu "Singleton" zu machen.
Testbeispiel:
[Bearbeiten]: Verwenden Sie die Alex-Antwort, wenn Sie die Instanz lieber über eine Eigenschaft als über eine Methode abrufen möchten.
quelle
new MySingleton()
5 mal sage? Reserviert Ihr Code eine einzelne Instanz?Ich denke, vielleicht verwenden Generika Teig
wie benutzt man
Schritt 1
Schritt 2
quelle
Sie können auch die Funktion Object.Freeze () verwenden . Es ist einfach und leicht:
quelle
if (!this.instance)
im Konstruktor beschäftigen? Ist dies nur eine zusätzliche Vorsichtsmaßnahme, falls Sie vor dem Export mehrere Instanzen erstellt haben?Ich habe eine neue Version davon gefunden, mit der der Typescript-Compiler völlig einverstanden ist, und ich denke, sie ist besser, weil nicht
getInstance()
ständig eine Methode aufgerufen werden muss.Dies hat einen anderen Nachteil. Wenn Ihre
Singleton
Eigenschaften vorhanden sind, gibt der Typescript-Compiler eine Anpassung aus, es sei denn, Sie initialisieren sie mit einem Wert. Aus diesem Grund habe ich eine_express
Eigenschaft in meine Beispielklasse aufgenommen, da Typescript denkt, dass sie nicht definiert wurde, es sei denn, Sie initialisieren sie mit einem Wert, auch wenn Sie sie später im Konstruktor zuweisen. Dies könnte durch Deaktivieren des strengen Modus behoben werden, aber ich ziehe es vor, wenn möglich, dies nicht zu tun. Diese Methode hat noch einen weiteren Nachteil, auf den ich hinweisen sollte, da der Konstruktor tatsächlich aufgerufen wird und jedes Mal, wenn er dies tut, eine andere Instanz technisch erstellt wird, auf die jedoch nicht zugegriffen werden kann. Dies könnte theoretisch zu Speicherlecks führen.quelle
Dies ist wahrscheinlich der längste Prozess, um einen Singleton in Typoskript zu erstellen, aber in größeren Anwendungen hat er für mich besser funktioniert.
Zuerst benötigen Sie eine Singleton-Klasse in "./utils/Singleton.ts" :
Stellen Sie sich nun vor, Sie benötigen einen Router-Singleton "./navigation/Router.ts" :
Nice!, Jetzt initialisieren oder importieren, wo immer Sie brauchen:
Das Schöne an Singletons auf diese Weise ist, dass Sie immer noch die Schönheit von Typoskriptklassen nutzen, dass Sie eine gute Intelligenz haben, die Singleton-Logik irgendwie getrennt bleibt und bei Bedarf leicht entfernt werden kann.
quelle
Meine Lösung dafür:
quelle
return Modal._instance
. Auf diese Weise erhalten Sie, wenn Sienew
diese Klasse haben, das vorhandene Objekt, kein neues.In Typescript muss man nicht unbedingt der
new instance()
Singleton-Methode folgen . Eine importierte statische Klasse ohne Konstruktor kann genauso gut funktionieren.Erwägen:
Sie können die Klasse importieren und
YourSingleton.doThing()
in jeder anderen Klasse darauf verweisen . Aber denken Sie daran, da es sich um eine statische Klasse handelt, die keinen Konstruktor hat. Daher verwende ich normalerweise eineintialise()
Methode, die von einer Klasse aufgerufen wird, die den Singleton importiert:Vergessen Sie nicht, dass in einer statischen Klasse jede Methode und Variable auch statisch sein muss, damit Sie stattdessen
this
den vollständigen Klassennamen verwendenYourSingleton
.quelle
Hier ist noch eine andere Möglichkeit, dies mit einem konventionelleren Javascript-Ansatz unter Verwendung eines IFFE zu tun :
Sehen Sie sich eine Demo an
quelle
Instance
Variable hinzuzufügen ? Sie können einfach die Variable und die Funktionen direkt darunter platzierenApp.Counter
.Eine andere Möglichkeit ist die Verwendung von Symbolen in Ihrem Modul. Auf diese Weise können Sie Ihre Klasse schützen, auch wenn der Endbenutzer Ihrer API normales Javascript verwendet:
Verwendung:
Wenn der Benutzer Ihre kompilierte API-JS-Datei verwendet, wird auch eine Fehlermeldung angezeigt, wenn er versucht, Ihre Klasse manuell zu instanziieren:
quelle
Kein reiner Singleton (Initialisierung kann nicht faul sein), aber ähnliches Muster mit Hilfe von
namespace
s.Zugriff auf Objekt von Singleton:
quelle
Dies ist der einfachste Weg
quelle
Auf diese Weise können wir eine Schnittstelle anwenden, anders als in Ryan Cavanaughs akzeptierter Antwort.
quelle
Nachdem ich diesen Thread durchsucht und mit allen oben genannten Optionen herumgespielt hatte, entschied ich mich für einen Singleton, der mit geeigneten Konstruktoren erstellt werden kann:
Es würde eine Ersteinrichtung erfordern (in
main.ts
, oderindex.ts
) , die leicht von implementiert werden kannnew Singleton(/* PARAMS */)
Rufen Sie dann irgendwo in Ihrem Code einfach an
Singleton.instnace
. In diesem Fallwork
würde ich anrufen , um fertig zu werdenSingleton.instance.work()
quelle