Функции потока Mobx не проверяются типом FlowType без .bind (это) - PullRequest
0 голосов
/ 09 октября 2018

Когда мы используем MobX flow декорированные функции, flowtype думает, что this имеет тип any и не проверяет тип.

class MyComponent extends Component<*> {
   actionMethod = flow(function*(){
        yield this.notAMethod();
   });
}

Однако, если мы свяжем это с генератором, flow понимает, что тип this равен MyComponent.

 class MyComponent extends Component<*> {
       actionMethod = flow((function*(){
            yield this.notAMethod();
       }).bind(this));
    }

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

  • Есть ли помехиправило для обеспечения правильного связывания (этого)?
  • Можем ли мы улучшить типизацию mobx?
  • Это проблема с потоком?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

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

public fetchProjects = flow(function*(this: ProjectStore) {
    this.projects = yield ProjectApi.get()
})
0 голосов
/ 17 октября 2018

Ваш вопрос сводится к возможности создания пользовательского линта.В Eslint есть отличная библиотека для написания ваших собственных правил eslint.Вы можете сравнить, используя https://astexplorer.net/, разницу между вашим кодом с this и без него.Затем вы можете написать правило eslint, которое будет выглядеть примерно так (не проверено):

// @no-flow
"use strict";
// Help from  https://astexplorer.net/
module.exports.rules = {
  "mobx-flow-requires-bind": context => ({
    CallExpression: function(node) {
      const ancestors = context.getAncestors();
      const parent = ancestors.length > 0 && ancestors[ancestors.length - 1];
      if (node.callee && node.callee.name === "flow") {
        if (node.arguments.length === 1) {
          const callee = node.arguments[0].callee;
          if (!(callee && callee.property && callee.property.name === "bind")) {
            context.report(node, "Calls to flow must be used with .bind");
          }
        }
      }
    }
  })
};

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

0 голосов
/ 11 октября 2018

это получено динамически в JavaScript.Таким образом, поток не может сказать вам, какой тип этот будет со статическим анализом.Единственное исключение - когда вы явно привязываете это к этому (как вы это делали во втором подходе) или когда вы используете функцию со стрелкой (но функции со стрелками не работают с yield).Имея это в виду, я отвечу на ваши вопросы:

Есть ли какое-либо правило распечатки, чтобы гарантировать, что мы связываем (это) правильно?

Flow сообщает вам тип, когдаиспользуя связывание.Таким образом, вам не нужно правило линтинга, так как тип правильный.

Можем ли мы улучшить типизацию mobx?

Это не ошибка типизации mobx.Это то, как работает JavaScript.Вы не можете сказать, какой тип будет во время выполнения (за исключением того, что вы используете функцию связывания или стрелки или вызываете метод экземпляра объекта)

Это проблема сflow?

См. ответ выше.

Вот длинный пост о том, как this в javascript работает https://stackoverflow.com/a/26574449/2379376

Я надеюсь, что яможет помочь уточнить ваш вопрос.

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