Я хочу передать компонент React в качестве входной информации другому компоненту React. Я пытался ссылаться на него как React.Component <*, *, *>, но когда я использую переданный компонент в методе рендеринга, я получаю ошибку. Вот как я написал свой код потока.

/* @flow */

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

const Input = props => <div>Yo</div>

type DefaultProps = {
  InputComponent: Input
};

type Props = {
  InputComponent: React.Component<*, *, *>
};

class App extends Component<DefaultProps, Props, void> {
  static defaultProps = {
    InputComponent: Input
  };

  props: Props;

  render() {
    const { InputComponent } = this.props

    return (
      <div>
        <InputComponent />
      </div>
    )
  }
}

ReactDOM.render(
  <App />,
  document.getElementById('root')
)

Однако в методе приложения App я получаю ошибку

React element `InputComponent` (Expected React component instead of React$Component)

Как правильно набирать компоненты ввода?

15
Esben 24 Апр 2017 в 11:00

2 ответа

Лучший ответ

Начиная с v0.59.0, вы должны использовать React.Component. Например:

/* @flow */

import React from 'react';

const Input = props => <div>Yo</div>

type Props = {
  InputComponent: React.Component<*, *>
};

class App extends React.Component<Props, void> {
  static defaultProps = {
    InputComponent: Input
  };

  render() {
    const { InputComponent } = this.props

    return (
      <div>
        <InputComponent />
      </div>
    )
  }
}

Вот рабочий пример для 0.59.0 , Как уже упоминалось в комментариях, есть описание изменений здесь.

:: До v0.59.0 ::

Вы должны использовать ReactClass<*> вместо React.Component.

Вот рабочий пример и документация < A HREF = "https://github.com/facebook/flow/blob/v0.44.1/lib/react.js#L96" rel = "nofollow noreferrer"> здесь !

/**
 * Type of a React class (not to be confused with the type of instances of a
 * React class, which is the React class itself). A React class is any subclass
 * of React$Component. We make the type of a React class parametric over Config,
 * which is derived from some of the type parameters (DefaultProps, Props) of
 * React$Component, abstracting away others (State); whereas a React$Component
 * type is useful for checking the definition of a React class, a ReactClass
 * type (and the corresponding React$Element type, see below) is useful for
 * checking the uses of a React class. The required constraints are set up using
 * a "helper" type alias, that takes an additional type parameter C representing
 * the React class, which is then abstracted with an existential type (*). The *
 * can be thought of as an "auto" instruction to the typechecker, telling it to
 * fill in the type from context.
 */
type ReactClass<Config> = _ReactClass<*, *, Config, *>;
type _ReactClass<DefaultProps, Props, Config: $Diff<Props, DefaultProps>, C: React$Component<DefaultProps, Props, any>> = Class<C>;
12
thejohnbackes 30 Ноя 2017 в 19:25

На версии Flow 0.93.0 вы можете сделать следующее.


    import type { Element as ReactElement } from 'react';

    type Props = {
      component: ReactElement
    }

0
Rob 7 Мар 2019 в 11:50