Эквивалент проверки компонента PropTypes в Flow

Учитывая следующий код с использованием PropTypes (см. эту проблему)

const SomeComponent = ({comp}) => {...}

SomeComponent.propTypes = { 
  comp: PropTypes.shape({
    type: PropTypes.oneOf([SomeOtherComponent])
  })
}

что эквивалентно использованию типов потока?

Я дошел только до:

const SomeComponent = ({comp}: {comp: React$Element<any>}) => {...}

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

Как проверить тип объекта, чтобы убедиться, что он является экземпляром определенного компонента React с использованием Flow?


person Palisand    schedule 01.05.2017    source источник


Ответы (2)


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

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

 function elementIsOfType(element, typeName) {
   if (!__DEV__) {
     return true;
   }
   return element.type.displayName === typeName;
 }

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

person Pedro Castilho    schedule 02.05.2017
comment
Я собираюсь задать этот вопрос еще несколько дней, прежде чем принять это. Оптимист во мне хочет, чтобы вы ошибались, но пессимист во мне уже знает, что это не так. - person Palisand; 02.05.2017
comment
Я надеюсь, что вам не придется принимать мой ответ, правда. Хотя я думаю, что я прав. - person Pedro Castilho; 02.05.2017

Начиная с Flow 0.53, это можно сделать с помощью React.Element<typeof Component>. .

person Palisand    schedule 25.09.2017