次の列挙型のようなクラスを作成しました: 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
クラスのリストを取得します。
問題は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]);
これがお役に立てば幸いです。