J'essaie d'appeler dynamiquement une méthode d'une classe dans Typescript et j'ai une erreur de compilation :

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'WasRun'.
  
No index signature with a parameter of type 'string' was found on type 'WasRun'.

Voici la classe:

export class WasRun {
  wasRun = false;

  constructor(private methodName: string) {}

  testMethod() {
    this.wasRun = true;
  }

  run() {
    const { methodName } = this;

    if (typeof this[methodName] !== "function") {
      return;
    }

    this[methodName]();
  }
}

Quelqu'un sait-il comment résoudre ce problème?

0
vsavitskiy 17 mars 2021 à 14:04

2 réponses

Meilleure réponse

Il est impossible de le faire de la façon dont vous essayez.

this[methodName]() est faux.

Le compilateur dactylographié et l'interpréteur javascript ont besoin d'une fonction définie pour exécuter votre code. Même si typescript compile d'une manière ou d'une autre votre code (ce qu'il ne fera pas et ne devrait pas), javascript générera sûrement une erreur.

Vous devrez trouver un autre moyen d'appeler dynamiquement vos fonctions. Parce que le nom que vous donnez à vos fonctions est pour votre (le programmeur) référence. Une fois que l'interpréteur prendra le relais, il aura sa propre façon de se référer à une fonction. Ainsi, au moment de l'exécution, le nom de votre fonction n'existe pas vraiment pour que l'interpréteur puisse déterminer quelle fonction vous souhaitez appeler par la chaîne fournie.

Vous pouvez le faire : if (methodName === 'abc') return abc(). Il fonctionnera parfaitement bien.

0
Tom Bombadil 17 mars 2021 à 11:22

Par l'errro, il semble qu'il s'agisse d'une erreur de type, vous devrez peut-être attribuer wasRun en tant que

  let wasRun:boolean = false;
0
Syed Mohib Uddin 17 mars 2021 à 14:55