Ошибки потока в <React.Fragment> или <> </>, но не в <Fragment>

Я использую react v16.3.0 и flow-bin v0.69.0

Использование реагирующих фрагментов с любым <React.Fragment> или стенография <></> синтаксис вроде так

import React from 'react'

const ComponentA = () => (
  <React.Fragment>
    <div>Component</div>
    <div>A</div>
  </React.Fragment>
)

const ComponentB = () => (
  <>
    <div>Component</div>
    <div>B</div>
  </>
)

Поток жалуется на следующую ошибку (это одинаковая ошибка для обоих, просто показывает вывод для ComponentA Вот)

Cannot get React.Fragment because property Fragment is missing in object type [1].

  24│ const ComponentA = () => (
  25│   <React.Fragment>
  26│     <div>Component</div>
  27│     <div>A</div>
  28│   </React.Fragment>

 /private/tmp/flow/flowlib_2349df3a/react.js
 251│   declare export default {|
 252│     +DOM: typeof DOM,
 253│     +PropTypes: typeof PropTypes,
 254│     +version: typeof version,
 255│     +initializeTouchEvents: typeof initializeTouchEvents,
 256│     +checkPropTypes: typeof checkPropTypes,
 257│     +createClass: typeof createClass,
 258│     +createElement: typeof createElement,
 259│     +cloneElement: typeof cloneElement,
 260│     +createFactory: typeof createFactory,
 261│     +isValidElement: typeof isValidElement,
 262│     +Component: typeof Component,
 263│     +PureComponent: typeof PureComponent,
 264│     +Children: typeof Children,
 265│   |};

С явным импортом Fragment Однако на поток не жалуюсь.

import { Fragment, default as React } from 'react'

const ComponentC = () => (
  <Fragment>
    <div>Component</div>
    <div>C</div>
  </Fragment>
)

Что здесь происходит? Я хотел бы использовать <></> Фрагментируйте сокращенный синтаксис, и эта проблема мешает мне сделать это сейчас.

Когда я копаюсь в react.js lib def, на который ссылаются в ошибке, действительно, кажется, что ошибка действительно корректна - экспорт Fragment определяется, а Fragment не определяется как свойство при экспорте по умолчанию.

Но документация потока утверждает, что поток поддерживает реагирующие фрагменты начиная с v0.59 и далее.

Так на самом ли деле это пробел в поддержке, который все еще существует? Или я что-то не так делаю? Возможно, у меня как-то устарела библиотека lib def или настроены неправильно? Я не могу найти ничего в поиске сообщения об ошибке, что наводит меня на мысль, что это проблема с моей настройкой. Также я не могу поверить, что это не сработает.

2 ответа

Решение

Исправление, чтобы включить React.Fragment в определение входит этот коммит: https://github.com/facebook/flow/commit/b76ad725177284681d483247e89739c292ed982b

Это должно быть доступно в потоке 0.71

Вы должны использовать import * as React from 'react' чтобы исправить это:)

Так просто как:

import * as React from 'react'

const Component = (): React.Element<typeof React.Fragment> => (
  <>
    <span> / </span>
    <span> \ </span>
  </>
)

export default Component

Поддержка фрагментов JSX доступна в Babel v7.0.0-beta.31 и выше! Если вы уже пользуетесь Babel 7, просто обновитесь до последней версии Babel и преобразования плагинов:

для пользователей пряжи

yarn upgrade @babel/core @babel/plugin-transform-react-jsx

для пользователей npm

npm update @babel/core @babel/plugin-transform-react-jsx

если вы используете предустановку реагирования

https://www.npmjs.com/package/@babel/preset-react

для пользователей пряжи

yarn upgrade @babel/core @babel/preset-react

для пользователей npm

npm update @babel/core @babel/preset-react

Другие вопросы по тегам