Ich wollte von herkömmlichem JS zu TypeScript wechseln, weil mir die C # -ähnliche Syntax gefällt. Mein Problem ist, dass ich nicht herausfinden kann, wie statische Klassen in TypeScript deklariert werden.
In C # verwende ich häufig statische Klassen, um Variablen und Methoden zu organisieren und sie in einer benannten Klasse zusammenzufügen, ohne ein Objekt instanziieren zu müssen. In Vanilla JS habe ich dies mit einem einfachen JS-Objekt gemacht:
var myStaticClass = {
property: 10,
method: function(){}
}
In TypeScript würde ich lieber meinen C-Sharpy-Ansatz wählen, aber es scheint, dass statische Klassen in TS nicht existieren. Was ist die geeignete Lösung für dieses Problem?
quelle
.js
in Ihr aufnehmen müssenhtml
. Also fürAngular 2
Sie verwenden wahrscheinlichSystem
... so würdeSystem.import("Folder/M");
(oder was auch immer der Pfad zu der kompilierten.js
Datei ist) vor dembootstrap import
Abstrakte Klassen sind seit TypeScript 1.6 ein erstklassiger Bürger von TypeScript. Sie können eine abstrakte Klasse nicht instanziieren.
Hier ist ein Beispiel:
quelle
Singleton
ist für das Shared-Memory-Muster derselben Klasseninstanz. Außerdem hat eine statische Klasse per Definition keine Instanz. Sie müssen daher eine Ausnahme auslösen, wenn der Client versucht, sie zu initialisieren.abstract
Schlüsselwort wird in TypeScript unterstützt.abstract
! @ KimchiMan - tolle Idee!Das Definieren statischer Eigenschaften und Methoden einer Klasse wird in 8.2.1 der Typescript-Sprachspezifikation beschrieben :
Wo
Point.distance()
ist eine statische (oder "Klasse") Methode.quelle
Diese Frage ist ziemlich veraltet, aber ich wollte eine Antwort hinterlassen, die die aktuelle Version der Sprache nutzt. Leider gibt es in TypeScript noch keine statischen Klassen. Sie können jedoch eine Klasse schreiben, die sich mit nur geringem Aufwand ähnlich verhält, indem Sie einen privaten Konstruktor verwenden, der die Instanziierung von Klassen von außen verhindert.
Mit diesem Snippet können Sie "statische" Klassen verwenden, die dem C # -Gleichstück ähnlich sind, mit dem einzigen Nachteil, dass es noch möglich ist, sie von innen zu instanziieren. Glücklicherweise können Sie Klassen nicht mit privaten Konstruktoren erweitern.
quelle
Dies ist eine Möglichkeit:
__static_ctor
Hier ist ein sofort aufgerufener Funktionsausdruck. Typescript gibt Code aus, um ihn am Ende der generierten Klasse aufzurufen.Update: Für generische Typen in statischen Konstruktoren, auf die statische Mitglieder nicht mehr verweisen dürfen, benötigen Sie jetzt einen zusätzlichen Schritt:
In jedem Fall können Sie natürlich einfach den statischen Konstruktor vom generischen Typ nach der Klasse aufrufen , z.
Denken Sie daran, nie Gebrauch
this
in__static_ctor
oben (offensichtlich).quelle
class SomeClass {}
erzeugt einen Konstruktor - kaum wert zu kommentieren , als ob ein neues Thema eingeführt wird. ;) FYI: Es gibt keine echten "Konstruktoren" in JS - nur Funktionen, die ein "this" haben, wenn sie für Objekte oder via aufgerufen werdennew
. Dies existiert unabhängig von einer "Klasse".Ich habe heute (31/07/2018) den gleichen Anwendungsfall erhalten und fand, dass dies eine Problemumgehung ist. Es basiert auf meiner Forschung und hat bei mir funktioniert. Erwartung - Um Folgendes in TypeScript zu erreichen:
Ich war das:
Daher werden wir es wie folgt konsumieren:
Das hat bei mir funktioniert. Wenn jemand andere bessere Vorschläge hat, lassen Sie es uns bitte alle hören !!! Vielen Dank...
quelle
Statische Klassen in Sprachen wie C # existieren, da es keine anderen Konstrukte der obersten Ebene zum Gruppieren von Daten und Funktionen gibt. In JavaScript ist dies jedoch der Fall, und daher ist es viel natürlicher, ein Objekt einfach so zu deklarieren, wie Sie es getan haben. Um die Klassensyntax genauer nachzuahmen, können Sie Methoden wie folgt deklarieren:
quelle
Siehe http://www.basarat.com/2013/04/typescript-static-constructors-for.html
Dies ist eine Möglichkeit, einen statischen Konstruktor zu "fälschen". Es ist nicht ungefährlich - siehe den Codeplex-Artikel, auf den verwiesen wird .
quelle
Eine Möglichkeit, dies zu erreichen, besteht darin, statische Instanzen einer Klasse in einer anderen Klasse zu haben. Beispielsweise:
Dann kann mit Wrapper auf Parameter zugegriffen werden, ohne dass eine Instanz davon deklariert werden muss. Beispielsweise:
Sie erhalten also die Vorteile des JavaScript-Typobjekts (wie in der ursprünglichen Frage beschrieben), aber die Vorteile, dass Sie die TypeScript-Typisierung hinzufügen können. Außerdem wird vermieden, dass vor allen Parametern in der Klasse 'static' hinzugefügt werden muss.
quelle
Mit externen ES6-Modulen kann dies folgendermaßen erreicht werden:
Dies verhindert die Verwendung interner Module und Namespaces, was von TSLint [1] [2] als schlechte Praxis angesehen wird , ermöglicht privates und öffentliches Scoping und verhindert die Initialisierung unerwünschter Klassenobjekte.
quelle
Ich suchte nach etwas Ähnlichem und stieß auf etwas namens
Singleton Pattern
.Referenz: Singleton-Muster
quelle
Sie können auch Schlüsselwörter verwenden
namespace
, um Ihre Variablen, Klassen, Methoden usw. zu organisieren. Siehe docquelle