Dans TypeScript, le const
mot clé ne peut pas être utilisé pour déclarer des propriétés de classe. Cela entraîne une erreur du compilateur avec «Un membre de classe ne peut pas avoir le mot clé« const ».»
Je me trouve dans le besoin d'indiquer clairement dans le code qu'une propriété ne doit pas être modifiée. Je veux que l'EDI ou le compilateur génère une erreur si j'essaie d'attribuer une nouvelle valeur à la propriété une fois qu'elle a été déclarée. Comment pouvez-vous y parvenir?
J'utilise actuellement une propriété en lecture seule, mais je suis nouveau sur Typescript (et JavaScript) et je me demande s'il y a une meilleure façon:
get MY_CONSTANT():number {return 10};
J'utilise tapuscrit 1.8. Suggestions?
PS: J'utilise maintenant le typo 2.0.3, j'ai donc accepté la réponse de David
la source
export
mot - clé avantclass
ainsipublic static
qu'avant lereadonly
mot - clé. Voir ici: stackoverflow.com/a/22993349export
(modules externes) et lepublic
mot-clé ne sont pas liés à cette question / réponse, mais sur le sujet de l'explicitness, je trouve personnellement extrêmement facile de dire qu'un membre est public lorsque le mot-clé n'existe pas. Je ne m'en soucie pas pour cette raison et parce qu'il ajoute plus de bruit et est inutile de taper. Cela rend également les membres du public plus distincts de ceux marqués commeprivate
ouprotected
. Quoi qu'il en soit, juste mon opinion :)static readonly myReadOnlyProperty
lorsque la classe est déclarée avecexport default class { ... }
? J'ai essayé this.myVar, self.myVar, statique, par défaut ... ne fonctionne pas ... (EDIT: default.myVar semble être la solution, mais je reçois une erreur de type)Les constantes peuvent être déclarées en dehors des classes et utilisées dans votre classe. Sinon, la
get
propriété est une bonne solution de contournementla source
get
propriété très appropriée dans votre casexport const
puis l'importer à partir d'un autre fichier. Ce serait assez facile à tester. Déclarez simplement unconst
dans un fichier et essayez de l'utiliser dans un autre sans exporter / importer, ou de l'utiliser à partir de la console du navigateur.Vous pouvez marquer les propriétés avec un
readonly
modificateur dans votre déclaration:@see TypeScript Deep Dive book - Lecture seule
la source
Angular 2 Fournit une fonctionnalité très intéressante appelée sous forme de constantes opaques. Créez une classe et définissez-y toutes les constantes à l'aide de constantes opaques.
Injectez-le dans les fournisseurs dans app.module.ts
Vous pourrez l'utiliser sur tous les composants.
EDIT pour Angular 4:
Pour Angular 4, le nouveau concept est Injection Token & Opaque token est obsolète dans Angular 4.
Jeton d'injection Ajoute des fonctionnalités au-dessus des jetons opaques, il permet de joindre des informations de type sur le jeton via des génériques TypeScript, plus des jetons d'injection, supprime la nécessité d'ajouter @Inject
Exemple de code
Angular 2 à l'aide de jetons opaques
Angular 4 à l'aide de jetons d'injection
Les jetons d'injection sont conçus logiquement au-dessus des jetons opaques et les jetons opaques sont déconseillés dans Angular 4.
la source
Soit utiliser le modificateur readOnly avec la constante que l'on doit déclarer, soit on peut déclarer une constante en dehors de la classe et l'utiliser spécifiquement uniquement dans la classe requise en utilisant l'opérateur get.
la source
Pour cela, vous pouvez utiliser le
readonly
modificateur. Les propriétés d'objet quireadonly
peuvent être attribuées uniquement lors de l'initialisation de l'objet.Exemple en cours:
Exemple dans les littéraux d'objet:
Il est également utile de savoir que le
readonly
modificateur est purement une construction tapuscrit et que lorsque le TS est compilé en JS, la construction ne sera pas présente dans le JS compilé. Lorsque nous modifions des propriétés qui sont en lecture seule, le compilateur TS nous en avertira (c'est JS valide).la source
Pour moi, aucune des réponses précédentes ne fonctionne. J'ai eu besoin de convertir ma classe statique en enum. Comme ça:
Ensuite, dans mon composant, j'ajoute une nouvelle propriété comme suggéré dans d'autres réponses
Ensuite, dans le modèle de mon composant, je l'utilise de cette façon
EDIT: Désolé. Mon problème était différent de celui des OP. Je laisse toujours cela ici si certains ont le même problème que moi.
la source