Tapuscrit: Ajouter des fonctions à un Enum
Est-il possible d'ajouter des fonctions à un type Enum en caractères d'imprimerie?
par exemple:
enum Mode {
landscape,
portrait,
//the dream...
toString() { console.log(this); }
}
Ou:
class ModeExtension {
public toString = () => console.log(this);
}
enum Mode extends ModeExtension {
landscape,
portrait,
}
Bien sûr, le toString()
fonction devrait contenir quelque chose comme un switch
Mais un cas d'utilisation serait de flux le long des lignes de:
class Device {
constructor(public mode:Mode) {
console.log(this.mode.toString());
}
}
Je comprends pourquoi, l'extension d'un enum
peut-être une chose étrange, je me demandais si c'est possible.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez soit avoir une classe qui est séparé de l'Enum et de l'utiliser pour obtenir des choses que vous voulez, ou vous pouvez fusionner un espace de noms dans l'Enum et obtenir tous dans ce qui ressemble à la même place.
Mode Utilitaire De La Classe
Donc ce n'est pas exactement ce que vous êtes après, mais cela permet d'encapsuler la Mode "à la chaîne" comportement à l'aide d'une méthode statique.
Vous pouvez l'utiliser comme ceci:
Mode Enum/Espace De Noms Fusionner
Vous pouvez fusionner un espace de noms avec l'Enum afin de créer ce qui ressemble à un Enum avec d'autres méthodes:
module
est maintenantnamespace
. J'ai également mis en évidence les principaux avantages d'un espace de noms dans ce cas particulier, qui est l'méthodes apparaissent en vertu de l'enum, c'est à direMode
.import { Mode } from "./Mode.ts"
et de l'utiliser de la même manière que dans votre exemple d'utilisation - est-ce possible avec les espaces de noms fusionné?namespace
approche potentiellement causer des problèmes dans les fonctions qui consomment le "enum" (par exemple pour effectuer une itération enum membres pour remplir une liste de sélection) va produire des résultats inattendus comme "myAddedMethod() {...}". Vous pouvez filtrer les étrangers non-enum membres lors de l'itération de point, mais seulement de souligner que cette approche n'est pas sans inconvénients.Vous pouvez obtenir la chaîne de valeur d'un non-const enum en utilisant des crochets:
Vous pouvez aussi mettre quelques enum spécifiques util fonctions dans l'enum, mais qui est juste comme statique des membres de la classe:
import Mode = require('Mode'); ... /*more code here...*/ <Mode.landscape> landScape = Mode.landscape;
et je suis d'erreur:error TS2503: Cannot find namespace 'Mode'
Mode
est le type que vous voulez lancer et de ne paslandscape
. Changer votre fonte de<Mode.landscape>
juste<Mode>
export
en face de la définition du module.Mode.doSomething(Mode.landscape);
à la fin de l'essai)export
et le problème, c'est que pour TS à fusionner les deux objets, ils doivent soit être exportés ou les deux pas être. Désolé pour la confusion.doSomething
d'une façon telle que vous pouvez l'appeler commeMode.landscape.doSomething()
? (Comme une méthode d'extension en C#)Convertir votre
enum
enum modèle. Je trouve que c'est une meilleure pratique en général pour de nombreuses langues, car sinon vous restreindre l'encapsulation les options de votre type. La tendance est àswitch
sur la valeur d'enum, alors qu'en réalité, des données ou des fonctionnalités qui dépendent de l'enum particulier la valeur doit il suffit d'aller dans chaque instance de l'enum. J'ai ajouté un peu plus de code pour illustrer.Cela pourrait ne pas fonctionner si vous êtes particulièrement dépend de la sous-tendent les valeurs de l'enum. Dans ce cas, vous devrez ajouter un membre pour les anciennes valeurs et convertir les endroits qui en ont besoin pour utiliser la nouvelle propriété.
peut faire enum comme par le constructeur privé et statique obtenir le retour de l'objet
puis, plus tard peut utiliser comme cette