2017-01-12 5 views
2

У меня есть следующий код в моем React приложение:Flowtype: условно требуемый тип

import isRequiredIf from 'react-proptype-conditional-require' 

Auth.propTypes = { 
    children: PropTypes.any, 
    step: PropTypes.number, 
    steps: isRequiredIf(PropTypes.number, props => props.hasOwnProperty('step')), 
    footer: PropTypes.any 
} 

Здесь steps требуется только в том случае step указан.

Я переношу свои прототипы React PropTypes в Flow. Могу ли я каким-то образом добиться такого же поведения с Flow?

ответ

3

Это не может быть сделано с помощью потока в этой форме. Поскольку PropTypes проверяются во время выполнения, а не статически, может быть больше гибкости. Если бы статичная typechecker разрешила такую ​​вещь, она была бы неразрешимой.

Однако, вы могли бы сделать что-то вроде этого:

type Props = { 
    children: any, 
    // not sure about this name, but you get the idea 
    step: ?{ 
    step: number, 
    steps: number, 
    }, 
    footer: any, 
} 

Или, если вы можете иметь steps, но не step:

type Props = { 
    children: any, 
    // not sure about this name, but you get the idea 
    step: ?{ 
    step?: number, 
    steps: number, 
    }, 
    footer: any, 
} 

Очевидно, что ни один из этих вариантов является столь же кратким, как то, что у вас есть, и это потребует изменения кода, который производит и потребляет эти значения. К сожалению, иногда можно заплатить цену, чтобы обеспечить безопасность статического typechecker.

Другим вариантом является просто оставить их необязательными:

type Props = { 
    children: any, 
    step?: number, 
    steps?: number, 
    footer: any, 
} 

Таким образом, поток не будет обеспечивать, что steps существует, если step существует. Однако вам не придется менять свой другой код, и нет ничего, что помешает вам добавить проверку времени выполнения (что будет не хуже того, что у вас уже есть).

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

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