Je voulais passer à TypeScript à partir du JS traditionnel car j'aime la syntaxe de type C #. Mon problème est que je ne peux pas savoir comment déclarer des classes statiques dans TypeScript.
En C #, j'utilise souvent des classes statiques pour organiser les variables et les méthodes, en les mettant ensemble dans une classe nommée, sans avoir besoin d'instatier un objet. Dans vanilla JS, j'avais l'habitude de faire cela avec un simple objet JS:
var myStaticClass = {
property: 10,
method: function(){}
}
Dans TypeScript, je préférerais mon approche C-sharpy, mais il semble que les classes statiques n'existent pas dans TS. Quelle est la solution appropriée à ce problème?
la source
.js
dans votre fichierhtml
. Donc, pourAngular 2
vous utilisez probablementSystem
... alors feraitSystem.import("Folder/M");
(ou quel que soit le chemin d'accès au.js
fichier compilé ) avant lebootstrap import
Les classes abstraites ont été un citoyen de première classe de TypeScript depuis TypeScript 1.6. Vous ne pouvez pas instancier une classe abstraite.
Voici un exemple:
la source
Singleton
est pour le modèle de mémoire partagée de la même instance de classe. De plus, une classe statique n'a pas d'instance par définition, vous devez donc lever une exception si le client tente de l'initialiser.abstract
mot-clé est pris en charge dans TypeScript.abstract
! @KimchiMan - super idée!La définition des propriétés statiques et des méthodes d'une classe est décrite dans 8.2.1 de la spécification du langage Typescript :
où
Point.distance()
est une méthode statique (ou "classe").la source
Cette question est assez datée mais je voulais laisser une réponse qui tire parti de la version actuelle du langage. Malheureusement, les classes statiques n'existent toujours pas dans TypeScript, mais vous pouvez écrire une classe qui se comporte de manière similaire avec seulement une petite surcharge en utilisant un constructeur privé qui empêche l'instanciation des classes de l'extérieur.
Cet extrait de code vous permettra d'utiliser des classes "statiques" similaires à l'homologue C # avec le seul inconvénient qu'il est toujours possible de les instancier de l'intérieur. Heureusement, vous ne pouvez pas étendre les classes avec des constructeurs privés.
la source
C'est une façon:
__static_ctor
voici une expression de fonction immédiatement invoquée. Typescript produira du code pour l'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és par des membres statiques, vous aurez besoin d'une étape supplémentaire maintenant:
Dans tous les cas, bien sûr, vous pouvez simplement appeler le constructeur statique de type générique après la classe, comme:
Rappelez - vous de ne jamais utiliser
this
en__static_ctor
haut (évidemment).la source
class SomeClass {}
un constructeur - il ne vaut guère la peine d'être commenté comme si un nouveau problème était introduit. ;) FYI: Il n'y a pas de vrais "constructeurs" dans JS - seulement des fonctions qui ont un "this" lorsqu'elles sont appelées sur des objets, ou vianew
. Cela existe quoi qu'il arrive pour n'importe quelle «classe».J'ai eu le même cas d'utilisation aujourd'hui (31/07/2018) et j'ai trouvé que c'était une solution de contournement. Il est basé sur mes recherches et cela a fonctionné pour moi. Attente - Pour atteindre les objectifs suivants dans TypeScript:
J'ai fait ça:
Par conséquent, nous le consommerons comme ci-dessous:
Cela a fonctionné pour moi. Si quelqu'un a d'autres meilleures suggestions, laissez-nous tous l'entendre !!! Merci...
la source
Les classes statiques dans des langages comme C # existent car il n'y a pas d'autres constructions de niveau supérieur pour regrouper des données et des fonctions. En JavaScript, cependant, ils le font et il est donc beaucoup plus naturel de simplement déclarer un objet comme vous l'avez fait. Pour imiter plus étroitement la syntaxe de la classe, vous pouvez déclarer des méthodes comme ceci:
la source
Voir http://www.basarat.com/2013/04/typescript-static-constructors-for.html
C'est une façon de «simuler» un constructeur statique. Ce n'est pas sans dangers - voir l' élément codeplex référencé .
la source
Une façon possible d'y parvenir est d'avoir des instances statiques d'une classe dans une autre classe. Par exemple:
Ensuite, les paramètres sont accessibles à l'aide de Wrapper, sans avoir à en déclarer une instance. Par exemple:
Ainsi, vous bénéficiez des avantages de l'objet de type JavaScript (comme décrit dans la question d'origine) mais avec les avantages de pouvoir ajouter le typage TypeScript. De plus, cela évite d'avoir à ajouter «statique» devant tous les paramètres de la classe.
la source
Avec les modules externes ES6, cela peut être réalisé comme suit:
Cela empêche l'utilisation de modules internes et d'espaces de noms, ce qui est considéré comme une mauvaise pratique par TSLint [1] [2] , permet une portée privée et publique et empêche l'initialisation d'objets de classe indésirables.
la source
Je cherchais quelque chose de similaire et suis tombé sur quelque chose appelé le
Singleton Pattern
.Référence: Singleton Pattern
la source
Vous pouvez également utiliser des mots clés
namespace
pour organiser vos variables, classes, méthodes, etc. Voir docla source