web-dev-qa-db-ja.com

タイプ 'string'のパラメーターを持つインデックス署名がタイプ 'typeof Object'で見つかりませんでした

次の列挙型のようなクラスを作成しました: 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クラスのリストを取得します。

3
user2530873

問題は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]);

これがお役に立てば幸いです。

1