2016-11-03 6 views
8

Если у меня есть что-то вроде этогоКаков тип возвращаемого потока функционального компонента «Реагировать без состояния»?

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

как я наберу аннотирование типа возвращаемого с потоком, то есть, что должно заменить /* ??? */ в коде ниже?

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

Edit: This является то, что документы потока должен сказать о апатридов функциональных компонентов. Я могу быть слепым, но я ничего не вижу о типе возврата, только типы prop.

+0

Почему вы хотели бы указать тип возврата? Это компонент, так что не всегда ли вы возвращаете его элементы? –

+1

Я хотел бы сделать это из-за согласованности с другими объявлениями функций и потому, что иногда компонент может возвращать «нуль» или компонент, но вопрос действительно является одним из curosity, и я полагаю, что это действительно «какой тип JSX block/возвращаемый тип React.createElement? " – ahstro

ответ

7

Возвращаемый тип чистого компонента (который является одним и тем же типом функции render нормальной составляющей) равен ?React$Element<any>.

Как вы можете прочитать в its definitionReact$Element имеет параметр Config тип, который не очень полезно само по себе, и он там только для обеспечения согласованности с определением ReactClass.

Так что ваше определение может быть записано как

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

или, если вы предпочитаете

import type { Element } from 'react' 

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

или даже

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

Оказывается, это React.Element, который является polymorphic type (который я не 100% уверен, что это значит), так что правильное (достаточно) код будет

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

Обратите внимание, что 'React.Element' не является допустимым типом. Фактическим типом, который вы можете использовать, является 'React $ Element <*>'. –

+0

Сначала я нашел «React $ Element», но затем я просмотрел [исходный код потока] (https://github.com/facebook/flow/blob/e6f6386f1e0c775bd9795bb7ed43a22f555948d9/tests/react_modules/createclass-module.js#L9) и что он используется как «React.Element». Любая идея почему? – ahstro

+0

Интересно. Я думаю, вы можете использовать его, если «React» импортируется, затем –

0

В зависимости от вашего .flowconfig, установка React$Element<any> в качестве возвращаемого типа может введите следующую ошибку:

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

Чтобы избежать этого, либо не проходит ни один вид вообще:

type PropsType = { foo: string } 

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

Или передать props псевдоним типа, а any:

type PropsType = { foo: string } 

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

 Смежные вопросы

  • Нет связанных вопросов^_^