Flowtype: как использовать метод вычисления в классе - PullRequest
0 голосов
/ 14 мая 2018

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

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

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

Невозможно получить this[command], так как в Commander 1 .

отсутствует свойство индексатора.

Больше информации вы можете увидеть flowtype try .

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

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 15 августа 2018

Спасибо за ваш ответ, но я хочу, чтобы код был аккуратным, и я нашел другое решение Попробуйте .Но используйте ключевое слово any, чтобы проверка не имела смысла в отношении статической проверки.- Cin

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

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

Это более безопасный способ: ( Попробуйте )

class Commander {
  $key: "create" | "test" | "undo" | "redo";
  $value: () => mixed
  constructor() {}
  create() {}
  test() {}
  undo() {}
  redo() {}
  execute(command, ...rest): void {
    this[command].apply(this, rest);
  }
}
0 голосов
/ 14 мая 2018

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

( Попробуйте )

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), чтобы сделать его немного чище, но это стилистически и не очень важно для вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...