Tapuscrit de classes statiques
Je voulais passer à la Machine à partir de traditionnelle JS parce que j'aime le C#comme syntaxe.
Mon problème est que je ne peux pas savoir comment déclarer les classes statiques en caractères d'imprimerie.
En C#, j'ai souvent utiliser des catégories pour organiser les variables et les méthodes, de les mettre ensemble dans une classe nommée, sans avoir besoin de démarrent des instances d'un objet.
En vanilla JS, j'ai l'habitude de le faire avec un simple JS objet:
var myStaticClass = {
property: 10,
method: function(){}
}
À la Machine, je préfère aller pour mon C-sharpy approche, mais il semble que les classes statiques n'existent pas dans TS.
Quelle est la solution pour ce problème ?
Vous devez vous connecter pour publier un commentaire.
Tapuscrit est pas en C#, donc ne vous attendez pas les mêmes concepts de C# en caractères d'imprimerie nécessairement. La question est: pourquoi voulez-vous les classes statiques?
En C# une classe statique est simplement une classe qui ne peut pas être sous-classé et ne doit contenir que des méthodes statiques. C# ne permet pas de définir des fonctions en dehors des classes. À la Machine, c'est possible, cependant.
Si vous êtes à la recherche d'un moyen de mettre vos fonctions/méthodes dans un espace de noms (c'est à dire pas global), vous pourriez envisager d'utiliser des caractères d'imprimerie de modules, par exemple
De sorte que vous pouvez accéder à M. f() de l'extérieur, mais pas de s, et vous ne pouvez pas étendre le module.
Voir le Tapuscrit spécification pour plus de détails.
.js
dans votrehtml
. Donc, pourAngular 2
vous utilisez probablementSystem
... donc feraisSystem.import("Folder/M");
(ou quel que soit le chemin d'accès est à la compilation des.js
fichier) avant lebootstrap import
Les classes abstraites ont été un citoyen de première classe de caractères d'imprimerie depuis Tapuscrit 1.6. Vous ne peut pas instancier une classe abstraite.
Voici un exemple:
Singleton
est pour la mémoire partagée de la même instance de la classe. Aussi, une classe statique n'a pas d'instance, par définition, de sorte que vous devez lever une exception si le client tente de les initialiser.abstract
mot-clé est prise en charge en caractères d'imprimerie.abstract
! @KimchiMan - excellente idée!La définition de propriétés et de méthodes statiques d'une classe est décrite dans 8.2.1 de la Tapuscrit Langage De Spécification:
où
Point.distance()
est statique (ou "classe"), méthode.Cette question est très daté mais je voulais laisser une réponse qui tire parti de la version actuelle de la langue. Malheureusement statique des classes n'existent encore en caractères d'imprimerie cependant, vous pouvez écrire une classe qui se comporte de façon similaire avec seulement une petite surcharge à l'aide d'un constructeur privé qui empêche l'instanciation des classes à partir de l'extérieur.
Cet extrait de code va vous permettre d'utiliser "statique" classes similaire à C# homologue avec le seul inconvénient qu'il est encore possible de les instancier à partir de l'intérieur. Heureusement que vous ne pouvez pas étendre des classes avec les constructeurs privés.
De cette manière:
__static_ctor
ici est immédiatement appelée fonction d'expression. Tapuscrit sera de sortie code pour appeler à la fin de la classe générée.Mise à jour: Pour les types génériques dans les constructeurs statiques, qui ne sont plus autorisés à être référencé par les membres statiques, vous aurez besoin d'une étape supplémentaire maintenant:
Dans tous les cas, bien sûr, vous pouvez simplement appeler le type générique constructeur statique après la classe, par exemple:
Rappelez-vous de ne JAMAIS utiliser
this
dans__static_ctor
ci-dessus (évidemment).class SomeClass {}
génère un constructeur - pas la peine de commenter comme si un nouveau problème se présente. 😉 Pour info: Il n'y a pas de véritable "constructeurs" en JS uniquement les fonctions qui ont un "présent" lorsqu'il est appelé sur les objets, ou vianew
. Cela existe, n'importe quoi pour n'importe quel "classe".J'ai eu le même cas d'utilisation aujourd'hui(31/07/2018) et trouvé ceci pour être une solution de contournement. Il est basé sur mes recherches et il a travaillé pour moi.
Attente À atteindre les objectifs suivants en caractères d'imprimerie:
Je l'ai fait:
Donc nous ne consomment comme ci-dessous:
Cela a fonctionné pour moi. Si quelqu'un a d'autres suggestions s'il vous plaît laissez-nous tous de l'entendre !!!
Merci...
Statique des classes dans les langages tels que C# existent pas car il n'y a pas d'autres haut-niveau de constructions pour des groupes de données et des fonctions. En JavaScript, cependant, qu'ils font et donc, il est beaucoup plus naturel de simplement déclarer un objet comme vous l'avez fait. Pour mieux imiter la classe de syntaxe, vous pouvez déclarer des méthodes comme:
Voir http://www.basarat.com/2013/04/typescript-static-constructors-for.html
C'est une façon de 'faux' un constructeur statique. Il n'est pas sans dangers - voir le référencé codeplex élément.
Un moyen possible d'y parvenir est d'avoir statique des instances d'une classe dans une autre. Par exemple:
Puis paramètres peut être consulté à l'aide de Wrapper, sans avoir à déclarer une instance de celle-ci. Par exemple:
Vous obtiendrez les avantages de l'JavaScript type d'objet (comme décrit dans la question d'origine), mais avec les avantages d'être en mesure d'ajouter le fichier d'enregistrement de la frappe. En outre, il évite d'avoir à ajouter "statique" en face de tous les paramètres dans la classe.
J'étais à la recherche de quelque chose de semblable et trouvé quelque chose qui s'appelle la
Singleton Pattern
.Référence: Le Pattern Singleton
Vous pouvez également utiliser le mot-clé
namespace
pour organiser vos variables, les classes, les méthodes et ainsi de suite. Voir doc