Est-il possible d'obtenir le nom de classe / type d'un objet lors de l'exécution en utilisant TypeScript?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
typescript
Adam Mills
la source
la source
Réponses:
Réponse simple:
Cependant: sachez que le nom sera probablement différent lors de l'utilisation de code minifié.
la source
let instance: any = this.constructor; console.log(instance.name);
any
estconsole.log(instance.constructor['name']);
interface Function { name: string; }
- cela étendra la définition "native".MyClass.name
ne fonctionnera pas bien si vous réduisez votre code. Parce que cela réduira le nom de la classe.Je sais que je suis en retard à la fête, mais je trouve que cela fonctionne aussi.
Alternativement ...
Le code ci-dessus obtient le code constructeur entier sous forme de chaîne et applique une expression régulière pour obtenir tous les «mots». Le premier mot doit être «fonction» et le deuxième mot doit être le nom de la classe.
J'espère que cela t'aides.
la source
Ma solution était de ne pas compter sur le nom de la classe. object.constructor.name fonctionne en théorie. Mais si vous utilisez TypeScript dans quelque chose comme Ionic, dès que vous allez en production, cela va exploser car le mode de production d'Ionic minimise le code Javascript. Ainsi, les classes reçoivent des noms comme "a" et "e".
Ce que j'ai fini par faire était d'avoir une classe typeName dans tous mes objets auxquels le constructeur attribue le nom de classe. Alors:
Oui, ce n'était pas vraiment ce qui avait été demandé. Mais utiliser le constructeur.nom sur quelque chose qui pourrait potentiellement être minifié en cours de route est juste un suppliant pour un mal de tête.
la source
Voir cette question .
Étant donné que TypeScript est compilé en JavaScript, au moment de l'exécution, vous exécutez JavaScript, donc les mêmes règles s'appliqueront.
la source
Vous devez d'abord convertir l'instance en
any
carFunction
la définition de type de n'a pas dename
propriété.Mettre à jour:
Avec TypeScript 2.4 (et potentiellement plus tôt), le code peut être encore plus propre:
la source
Property 'name' does not exist on type 'Function'.
(this as {}).constructor.name
ou(this as object).constructor.name
est mieux queany
parce que vous obtenez alors la saisieDans Angular2, cela peut aider à obtenir le nom des composants:
comp: any est nécessaire car la compilation TypeScript générera des erreurs car Function n'a initialement pas de nom de propriété.
la source
element.nativeElement
- Sur une directive, vous pouvez obtenir le nom du composant comme ceci@Optional() element: ElementRef<HTMLElement>
, puis utiliserif (element != null && element.nativeElement.tagName.startsWith('APP-')) { this.name = element.nativeElement.tagName; }
Le code TypeScript complet
la source
myClass.prototype.constructor.name
.myClass.constructor.name
j'ai eu l'erreur TypeScript:error TS2339: Property 'name' does not exist on type 'Function'
.la source
Cette solution fonctionne après uglification de minification mais nécessite de décorer les classes avec des métadonnées.
Nous utilisons la génération de code pour décorer nos classes d'entité avec des métadonnées comme ceci:
Consommez ensuite avec l'aide suivante:
la source
Si vous savez déjà à quels types vous attendre (par exemple, lorsqu'une méthode renvoie un type d'union ), vous pouvez utiliser des gardes de type.
Par exemple, pour les types primitifs, vous pouvez utiliser un typeof guard :
Pour les types complexes, vous pouvez utiliser une instance de guard :
la source