Как указать тип null prop в ReactJS?

У меня есть ссылка на компонент ReactJS, который имеет нулевую или неизменяемую карту.

В нижней части моего виджета, если я пишу:

MyComponent.propTypes = {
    myMap: React.PropTypes.instanceOf(Immutable.Map)
};

Я оставляю это открытым для возможности быть null, undefined или Map.

Как я могу сделать это необходимым, и только тип null или карта?

https://facebook.github.io/react/docs/typechecking-with-proptypes.html

Я вижу этот пример, но я не знаю, как адаптировать синтаксис к моим потребностям или если это возможно.

Изменение: если свойство имеет значение null, оно все еще существует, но неопределенное означает, что оно не было включено вообще.

Например:

<Component id={1} data={null} />
<Component id={2} data={Immutable.Map()} />
<Component id={3} />

Ответ 1

Это требование не поддерживается в текущей версии React.

См. Реакт № 2166 для более подробной информации. В этом выпуске обсуждается возможность использования свойства isRequiredOrNull в дополнение к isRequired. Итог:

Я не ожидаю дальнейших изменений в PropTypes. В последнее время Flow стал более зрелым, и, как я слышал от команды React, это более долговременное решение для проверки типов. Это помещает PropTypes в ту же корзину "совместимости" с точки зрения приоритетов - подобно аддонам createClass или React, они все еще поддерживаются, но только с исправлениями ошибок и улучшениями производительности, без добавления новых функций или изменения API.

Другими словами, если вам требуется более сложная проверка типов, используйте вместо этого Flow.

Ответ 2

Можно использовать PropTypes.oneOf([null]).isRequired. Это должно разрешить нуль, и ничего больше. Вы можете комбинировать это с любым другим типом:

PropTypes.oneOfType([
  PropTypes.string.isRequired,
  PropTypes.oneOf([null]).isRequired,
]).isRequired

Редактировать: у меня только что пропал этот тип пропора, когда мне дали нулевой проп с использованием проп-типов 15.7.2, поэтому я не уверен, что это работает больше (если оно когда-либо было?). Я вернулся к разрешению как неопределенных, так и нулевых значений, просто не используя isRequired.

Ответ 3

Возможно, слишком поздно, но эта работа для меня - это специальный propType. Дополнительная информация в интерактивных документах: https://reactjs.org/docs/typechecking-with-proptypes.html#proptypes

static propTypes = {
  myMap: function(props, propName, componentName) {
    if (props[propName] !== null && !(props[propName] instanceof Immutable.Map)) {
      return new Error(
        'Invalid prop '' + propName + '' supplied to '' + componentName + ''. Expected null or Immutable.Map, but received ' + typeof props[propName] + '. Validation failed.'
      )
    }
  },
}

Ответ 5

У меня была схожая проблема, и как я сюда попал. Я нашел решение, достаточно хорошее для меня, поэтому я мог бы также поделиться им.

Короче говоря, я удалил .isRequired и установил defaultProps .isRequired null.

Я хотел что-то вроде этого:

// this won't work, because 'PropTypes.null' doesn't exists!
MyComponent.propTypes = {
  item: PropTypes.oneOfType([ItemPropTypesShape, PropTypes.null]).isRequired,
};

// this also won't work!
MyComponent.propTypes = {
  item: PropTypes.oneOfType([ItemPropTypesShape, PropTypes.instanceOf(null)]).isRequired,
};

Нуль всегда рассматривается как ошибка, когда требуется поддержка.

Я закончил это:

MyComponent.propTypes = {
  item: ItemPropTypesShape,
};

MyComponent.defaultProps = {
  item: null,
};

Если PropTypes - это все, что у нас есть, это работает для меня!