2016-11-03 1 views
8

Si j'ai quelque chose comme çaQuel est le type de retour de flux d'un composant fonctionnel sans état React?

const RandomComponent = (props) => (
    <div> 
    <SomeSubComponent id={props.id} /> 
    <AnotherSubComponent type={props.type} /> 
    </div> 
) 

comment vais-je taper annoter le type de retour avec un débit, à savoir, ce qui devrait remplacer /* ??? */ dans le code ci-dessous?

const RandomComponent = (props: { id: string, vino: number): /* ??? */ => (
    <div> 
    <SomeSubComponent id={props.id} /> 
    <AnotherSubComponent veryImportantNumber={props.vino} /> 
    </div> 
) 

Edit: This est ce que les documents de flux a à dire sur les composants fonctionnels sans état. Je peux être aveugle, mais je ne vois rien sur un type de retour, seulement des types de prop.

+0

Pourquoi voudriez-vous préciser un type de retour? C'est un composant, alors ne renverrais-tu pas toujours ses éléments? –

+1

Je voudrais le faire en raison de la cohérence avec d'autres déclarations de fonctions et parce que parfois un composant peut retourner 'null' ou un composant, mais la question est vraiment celle de la curiosité, et je suppose que c'est vraiment" quel est le type d'un Bloc JSX/le type de retour de React.createElement? " – ahstro

Répondre

7

Le type de retour d'un composant pur (qui est le même type de la fonction render d'un composant normal) est ?React$Element<any>.

Comme vous pouvez le lire dans its definitionReact$Element a un paramètre de type Config qui n'est pas très utile en soi et il est là que pour la cohérence avec la définition de ReactClass.

Ainsi, votre définition peut être écrite comme

const RandomComponent = (props: { id: string, vino: number }): React$Element<any> => (
    <div> 
    <SomeSubComponent id={props.id} /> 
    <AnotherSubComponent veryImportantNumber={props.vino} /> 
    </div> 
) 

ou si vous préférez

import type { Element } from 'react' 

const RandomComponent = (props: { id: string, vino: number }): Element<any> => (
    <div> 
    <SomeSubComponent id={props.id} /> 
    <AnotherSubComponent veryImportantNumber={props.vino} /> 
    </div> 
) 

ou même

import React from 'react' 

const RandomComponent = (props: { id: string, vino: number }): React.Element<any> => (
    <div> 
    <SomeSubComponent id={props.id} /> 
    <AnotherSubComponent veryImportantNumber={props.vino} /> 
    </div> 
) 
0

Turns out il est React.Element, qui est un polymorphic type (que je ne suis pas 100% sûr de ce que cela signifie), de sorte que le bon code (assez) serait

const RandomComponent = (props: { id: string, vino: number): React.Element<*> => (
    <div> 
    <SomeSubComponent id={props.id} /> 
    <AnotherSubComponent veryImportantNumber={props.vino} /> 
    </div> 
) 
+0

Veuillez noter que 'React.Element' n'est pas un type valide. Le type réel que vous pouvez utiliser est 'React $ Element <*> '. –

+0

J'ai trouvé 'React $ Element' en premier, mais j'ai ensuite regardé le code source de [flux] (https://github.com/facebook/flow/blob/e6f6386f1e0c775bd9795bb7ed43a22f555948d9/tests/react_modules/createclass-module.js#L9) et trouvé qu'il est utilisé comme 'React.Element'. Une idée pourquoi? – ahstro

+0

Intéressant. Je suppose que vous pouvez l'utiliser si 'React' est importé puis –

0

En fonction de votre .flowconfig, la mise en React$Element<any> comme type de retour peut Lancez l'erreur suivante:

error Unexpected use of weak type "any" flowtype/no-weak-types

Pour éviter cela, passer aucun type du tout:

type PropsType = { foo: string } 

const Baz = (props: PropsType): React$Element => 
    <h1>Hello, { props.foo }</h1> 

Ou, passer un alias de type props, au lieu de any:

type PropsType = { foo: string } 

const Baz = (props: PropsType): React$Element<PropsType> => 
    <h1>Hello, { props.foo }</h1>