Не найдена подпись индекса с параметром типа 'строка' для типа 'Тип объекта' - PullRequest
0 голосов
/ 09 июля 2019

Я сделал класс, выполнив следующее перечисление: 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) {
  };
}

Когда я получаю доступ с ключом, который я определил, он работает нормально, но не удается, когда я пытаюсь получить доступ динамически, как это:

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!

Ошибка:

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

Кто-нибудь мне поможет, в чем причина ошибки и ее решение?

Пожалуйста, помогите, спасибо.

Я добавил индексную подпись в класс, но это не помогло

[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) {
  };
}

Получить список enum класса.

1 Ответ

0 голосов
/ 09 июля 2019

Проблема, похоже, заключается в использовании Object.keys, поскольку она всегда будет перебирать список строк по сравнению со списком строк, которые являются ключами к объекту. Если вы хотите получить все значения объекта, я бы вместо этого использовал Object.values. Однако это вызовет проблему, так как конструктор также будет возвращен как значение (прототип), что вызовет другие проблемы с печатанием.

Я бы порекомендовал иметь ваши статические соки в качестве отдельного объекта, на который вы можете ссылаться при необходимости. Пример:

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]);

Надеюсь, это было полезно.

...