在“ typeof对象”类型上找不到带有“字符串”类型参数的索引签名

时间:2019-07-09 03:49:09

标签: javascript typescript index-signature

我做了一个类似于枚举的类: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 :(得分:0)

该问题似乎正在使用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]);

我希望这会有所帮助。