Obtenir le nom de la classe d’un object à l’exécution dans TypeScript

Est-il possible d’obtenir le nom de classe / type d’un object lors de l’exécution à l’aide de typecript?

class MyClass{} var instance = new MyClass(); console.log(instance.????); // Should output "MyClass" 

Réponse simple:

 class MyClass {} const instance = new MyClass(); console.log(instance.constructor.name); // MyClass console.log(MyClass.name); // MyClass 

Cependant, prenez garde que le nom sera probablement différent lorsque vous utilisez du code minifié.

Je sais que je suis en retard à la fête, mais je trouve que cela fonctionne aussi.

 var constructorSsortingng: ssortingng = this.constructor.toSsortingng(); var className: ssortingng = constructorSsortingng.match(/\w+/g)[1]; 

Alternativement …

 var className: ssortingng = this.constructor.toSsortingng().match(/\w+/g)[1]; 

Le code ci-dessus obtient l’intégralité du code constructeur sous forme de chaîne et applique une expression régulière pour obtenir tous les mots. Le premier mot devrait être “function” et le second mot devrait être le nom de la classe.

J’espère que cela t’aides.

Voir cette question .

Comme TypeScript est compilé en JavaScript, à l’exécution, vous exécutez JavaScript, de sorte que les mêmes règles s’appliquent.

Ma solution n’était pas de 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 irez en production, il va s’enflammer car le mode de production d’Ionic minimise le code Javascript. Donc, les classes ont des noms nommés comme “a” et “e”.

J’ai fini par avoir une classe typeName dans tous les objects auxquels le constructeur atsortingbue le nom de la classe. Alors:

 export class Person { id: number; name: ssortingng; typeName: ssortingng; constructor() { typeName = "Person"; } 

Oui, ce n’était pas ce qui était demandé, vraiment. Mais utiliser le nom du constructeur sur quelque chose qui pourrait éventuellement être réduit au bout du compte ne demande que des maux de tête.

Vous devez d’abord convertir l’instance en un any car la définition de type de Function ne possède pas de propriété name .

 class MyClass { getName() { return (this).constructor.name; // OR return (this as any).constructor.name; } } // From outside the class: var className = (new MyClass()).constructor.name; // OR var className = (new MyClass() as any).constructor.name; console.log(className); // Should output "MyClass" // From inside the class: var instance = new MyClass(); console.log(instance.getName()); // Should output "MyClass" 

Mettre à jour:

Avec TypeScript 2.4 (et éventuellement plus tôt), le code peut être encore plus propre:

 class MyClass { getName() { return this.constructor.name; } } // From outside the class: var className = (new MyClass).constructor.name; console.log(className); // Should output "MyClass" // From inside the class: var instance = new MyClass(); console.log(instance.getName()); // Should output "MyClass" 

Dans Angular2, cela peut aider à obtenir le nom des composants:

  getName() { let comp:any = this.constructor; return comp.name; } 

comp: any est nécessaire, car la compilation des typescript générera des erreurs, car Function initialement n’a pas de nom de propriété.

  • Doit append “. Prototype. ” À utiliser: myClass.prototype.constructor.name .
  • Sinon, avec le code suivant: myClass.constructor.name , j’ai eu l’erreur typographique:

error TS2339: Property 'name' does not exist on type 'Function' .

Le code TypeScript complet

 public getClassName() { var funcNameRegex = /function (.{1,})\(/; var results = (funcNameRegex).exec(this["constructor"].toSsortingng()); return (results && results.length > 1) ? results[1] : ""; } 

Si vous connaissez déjà les types attendus (par exemple, lorsqu’une méthode retourne un type d’union ), vous pouvez utiliser des gardes de type.

Par exemple, pour les types primitifs, vous pouvez utiliser un type de protection :

 if (typeof thing === "number") { // Do stuff } 

Pour les types complexes, vous pouvez utiliser une instance de protection :

 if (thing instanceof Array) { // Do stuff }