Ошибка потока "реквизиты несовместимы с пустыми" при создании экземпляра компонента без передачи реквизита - PullRequest
0 голосов
/ 07 мая 2018

У меня есть компонент, который заключен в "connect" реактивного-редукса. Все реквизиты компонента поставляются с помощью mapStateToProps и MapDispatchToProps, поэтому «ownProps» не передается в компонент.

Однако я получаю следующую ошибку потока:

Cannot create Credits element because props [1] is incompatible with empty [2].

     src/components/ChildrenView/index.js
     323│         />
     324│
     325│         {/* Credits */}
 [1] 326│         <Credits />
     327│
     328│         {/* fullscreen pictures rhat open with onClick on tge image */}
     329│         <PhotoViewer />

     flow-typed/npm/react-redux_v5.x.x.js
 [2] 110│     CP: $Diff<ElementConfig<Com>, RSP>,

Разве реквизиты в 1 уже пусты ??

Я использую типизированный поток, поскольку вы можете указать в ошибке.

Вот определение класса и вызов connect:

type Props = {|
  ...mapStateToPropsType,
  pricingModal: typeof pricingModal,
  offlineModal: typeof offlineModal,
|}


class Credits extends React.Component<Props> { ... }


type mapStateToPropsType = {|
  balance: number,
  isVisiblePricing: boolean,
  isConnected: boolean,
  isVisibleOffline: boolean,
|}

const mapStateToProps = ({ parents, pricing, appState }: TP.State): mapStateToPropsType => ({
  balance: parents.balance || 0,
  isVisiblePricing: pricing.modalPricing,
  isConnected: appState.isConnected,
  isVisibleOffline: appState.modalOffline,
})

export default connect(mapStateToProps, { pricingModal, offlineModal })(Credits)

Как я могу удалить эту ошибку (без использования $ FlowFixMe: /)?

Редактировать 1

Если я внесу следующее изменение в определение типа «connect» в строке 110 и 114 в файле реагировать-redux_v5.x.x.js , проверка типа будет работать как положено.

До:

  declare export function connect<
    Com: ComponentType<*>,
    S: Object,
    SP: Object,
    RSP: Object,
    MDP: Object,
    CP: $Diff<ElementConfig<Com>, RSP>,
  >(
    mapStateToProps: MapStateToProps<S, SP, RSP>,
    mapDispatchToProps: MDP,
  ): (component: Com) => ComponentType<$Diff<CP, MDP> & SP>

После того, как:

  declare export function connect<
    Com: ComponentType<*>,
    S: Object,
    SP: Object,
    RSP: Object,
    MDP: Object,
    CP: $Diff<$Diff<ElementConfig<Com>, RSP>, MDP>, /*  <-- here */
  >(
    mapStateToProps: MapStateToProps<S, SP, RSP>,
    mapDispatchToProps: MDP,
  ): (component: Com) => ComponentType<CP & SP> /*  <-- here */

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Я не могу комментировать ответ Джеймса Крауса, потому что мне не хватает репутации, но я могу подтвердить, что обновление до последней версии потока (0.71) исправило его для меня. Я буквально наткнулся на ту же проблему 30 минут назад. Мне не пришлось обновлять определения с типом потока. Примите ответ Джеймса, если он сработал и для вас.

Хотя, в моем случае, мне все равно придется использовать $ FlowFixMe, потому что я работаю с native-реакцией, а обновление до любой версии выше 0.67.x нарушает все остальное.

0 голосов
/ 07 июня 2018

Я тоже не могу комментировать из-за своей репутации. У меня была та же проблема, что и у Алекса Борга. Я также застрял в потоке 0.67.1 из-за реактивной нативности.

Это происходит, когда:

  1. вы передаете connect объект для аргумента mapDispatchToProps: похоже, что-то не так с lib def функции connect, которая принимает объект для аргумента mapDispatchToProps, который Франсиско Сарменто отметил выше. У Flow, похоже, нет проблем, если вы связываете действия по отправке как реквизиты, используя функцию. Определение lib для этой версии функции соединения немного отличается и довольно близко к редактированию, выполненному Франциско Сарменто.
  2. вы не указываете никаких реквизитов при создании экземпляра HOC, возвращаемого connect, (например, все требуемые параметры покрыты response-redux), и
  3. вы используете компонент в отдельном файле, из которого он определен (например, имеется экспорт и импорт). Ссылка на Flow.org/try, которую Джеймс Краус представил выше, заставила меня задуматься. Мой конкретный компонент работал, как и ожидалось, когда я запускал его, используя настройки Джеймса Затем я заметил, что мой локальный поток не жаловался, если я создал экземпляр HOC в том же файле, в котором он был определен. Поток выплюнул Cannot create XXX element because props [1] is incompatible with empty [2] только когда я импортировал HOC в другой файл. Я понятия не имею, какие потенциальные последствия это может иметь - возможно, это не имеет отношения к основной причине и является просто проблемой локальной среды.
0 голосов
/ 07 мая 2018

Используете ли вы последнюю версию Flow и Typedefs? Я не вижу ошибок, когда использую последнюю версию Flow и последние определения типов в объединенном примере на Flow.org / try . Если это не поможет, попробуйте создать рабочий пример своей проблемы на Flow.org/try (предпочтительно) или на Github.

...