Flowtype: как использовать метод вычисления в классе

Я хочу посетить свойство класса в соответствии с параметрами в виде следующего кода:

class Commander {
  constructor() {}
  create() {}
  test() {}
  undo() {}
  redo() {}
  execute(...args): void {
    const command: string = args.slice(0);
    const rest: any[] = args.slice(1);
    this[command].apply(this, rest);
  }
}

Но я получил ошибку, как показано ниже:

Cannot get this[command] because an indexer property is missing in Commander 1.

More info you can see the flowtype try.

Если я сделаю некоторые глупости, и, пожалуйста, дайте мне знать!

Спасибо!!


person Cin    schedule 14.05.2018    source источник


Ответы (2)


Thanks your answer, but I wanna the code keep tidy, and I found the another solve Попробуйте. Но используйте любое ключевое слово, чтобы проверка статической проверки не имела смысла. – Цин

Если вы используете любое ключевое слово, это то же самое, что просто отключить поток для всего, что касается этой переменной.

«Если вам нужен способ отказаться от использования средства проверки типов, это можно сделать любым способом. Использование любого совершенно небезопасно, и его следует по возможности избегать». из любого

This is a safer way: (Try)

class Commander {
  $key: "create" | "test" | "undo" | "redo";
  $value: () => mixed
  constructor() {}
  create() {}
  test() {}
  undo() {}
  redo() {}
  execute(command, ...rest): void {
    this[command].apply(this, rest);
  }
}
person Zaide Chris    schedule 15.08.2018

Поскольку средство доступа к свойствам re using может быть любой строкой, Flow считает, что вы пытаетесь использовать свой экземпляр класса как карта. Чтобы обойти это, вам нужно сделать некоторую проверку переменной command перед вызовом методов экземпляра. Вот мой предложенный способ, как это сделать:

(Try)

class Commander {
  constructor() {}
  create() {}
  test() {}
  undo() {}
  redo() {}
  execute(...args): void {
    const command: string = args.slice(0);
    const rest: any[] = args.slice(1);
    switch(command) {
      case "test":
        this.test.apply(this, rest);
        break;
      case "undo":
        this.undo.apply(this, rest);
        break;
      case "redo":
        this.redo.apply(this, rest);
        break;
      default:
        throw new Error("Invalid command");
    }
  }
}

Вы также можете заменить синтаксис method.apply(this, rest) на method(...rest), чтобы все было немного чище, но это стилистически и не очень относится к вашему вопросу.

person James Kraus    schedule 14.05.2018
comment
Thanks your answer, but I wanna the code keep tidy, and I found the another solve Попробуйте. Но используйте ключевое слово any, сделайте проверку статической проверки бессмысленной. - person Cin; 15.05.2018