Flowtype: условно требуемый тип

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

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?


person Yan Takushevich    schedule 12.01.2017    source источник


Ответы (1)


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

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

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,
}

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

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

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

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

person Nat Mote    schedule 12.01.2017