web-dev-qa-db-fra.com

Aucune signature d'index avec un paramètre de type 'chaîne' n'a été trouvée sur le type 'typeof Object'

J'ai fait une classe faisant comme enum suivante: https://stackoverflow.com/a/51398471

export default class Juice
{
  [key: string]: any;

  static Apple = new Juice('Apple', 'Apple juice');
  static ORANGE = new Juice('ORANGE', 'Orange juice');

  private constructor(private key:string, public readonly text:string) {
  };
}

Lorsque j'obtiens l'accès avec la clé que j'ai définie, cela fonctionne bien, mais cela a échoué lorsque j'essaie d'accéder en dynamiquement comme ceci:

console.log(Juice.Apple); //works fine
console.log(Juice['Apple']); //works fine
const key = 'Apple'; //works fine
console.log(Juice[key]); //works fine
console.log(Object.keys(Juice).map((key:string) => Juice[key])); // error!

L'erreur est:

TypeScript error in `path`
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'typeof Juice'.
No index signature with a parameter of type 'string' was found on type 'typeof Juice'.  TS7053

Est-ce que quelqu'un m'aide sur la cause de l'erreur et la solution?

Veuillez aider, merci.

J'ai ajouté la signature d'index dans la classe, mais cela n'a pas aidé

[key: string]: any;
export default class Juice
{
  [key: string]: any;

  static Apple = new Juice('Apple', 'Apple juice');
  static ORANGE = new Juice('ORANGE', 'Orange juice');

  private constructor(private key:string, public readonly text:string) {
  };
}

Récupère la liste de la classe enum.

3
user2530873

Le problème semble utiliser Object.keys car il parcourra toujours une liste de chaînes par rapport à une liste de chaînes qui sont les clés de l'objet. Si vous voulez obtenir toutes les valeurs d'un objet, j'utiliserais plutôt Object.values. Cependant, cela entraînera un problème car le constructeur sera également renvoyé en tant que valeur (prototype), ce qui entraînera d'autres problèmes de frappe.

Je recommanderais d'avoir vos jus statiques comme un objet séparé que vous pouvez référencer en cas de besoin. Exemple:

class Juice {
  constructor(private key: string, public readonly text: string) {}
}

const juices = {
  Apple: new Juice('Apple', 'Apple juice'),
  ORANGE: new Juice('ORANGE', 'Orange juice')
};
export default juices;

console.log(Object.values(Juice));

const test: keyof typeof juices = 'Apple';
console.log(juices[test]);

J'espère que cela a été utile.

1
Mateusz Siniarski