web-dev-qa-db-fra.com

Obtenir le nom de la méthode depuis une méthode TypeScript

Je veux obtenir le nom de la méthode actuelle à partir d'une méthode d'instance d'une classe dans TypeScript.

(Pseudocode, ne fonctionne pas):

class Foo {
    bar() {
        console.log(something); //what should something be?
    }
}

new Foo().bar();

Je m'attends à ce que «quelque chose» retourne «bar». Je réalise que this peut me donner la classe et que je pourrais en tirer la classe et ses attributs, mais je ne sais pas comment obtenir 'cette fonction' (c’est-à-dire la barre de méthode, pas la classe Foo).

J'ai vu plusieurs autres questions liées à la recherche du nom de la classe, etc., mais aucune ne traitait de l'obtention du nom de la méthode actuelle.

5
Anand

En plus du arguments.callee.name , il n’existe aucun moyen simple d’obtenir cela.

Je propose 2 autres méthodes:

Utilisez les décorateurs pour injecter le nom de la méthode:

function annotateName(target, name, desc) {
    var method = desc.value;
    desc.value = function () {
        var prevMethod = this.currentMethod;
        this.currentMethod = name;
        method.apply(this, arguments);
        this.currentMethod = prevMethod;   
    }
}

class Foo {
    currentMethod: string;

    @annotateName
    bar() {
        alert(this.currentMethod);
        this.Tux();
        alert(this.currentMethod);
    }

    @annotateName
    Tux() {
        alert(this.currentMethod);
    }
}

new Foo().bar();

L'inconvénient est que vous devez annoter toutes les fonctions dont vous souhaitez obtenir le nom. Vous pouvez simplement annoter la classe et, dans le décorateur, itérer sur toutes les fonctions du prototype et appliquer la même idée.


Ma deuxième option n'est pas normalisée et nécessite plus de soin pour obtenir des résultats cohérents sur tous les navigateurs. Il repose sur la création d'un objet Error et sur l'obtention de stack trace.

class Foo {
    bar() {
        console.log(getMethodName());    
    }
}

function getMethodName() {
    var err = new Error();
    return /at \w+\.(\w+)/.exec(err.stack.split('\n')[2])[1] // we want the 2nd method in the call stack

}

new Foo().bar();
8
Cristi Mihai

Je ne sais pas si cela aiderait, mais:

class Foo {
    bar() {
        console.log(Object.getOwnPropertyNames(Foo.prototype)); // ["constructor", "bar"]
    }
}

new Foo().bar();
2
Slai

pour nom de classe - Foo.name pour nom de méthode - this.bar.name

0
Oleksii Shevchuk