Как указать тип 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.'
)
}
},
}
Ответ 4
Похоже, что PropTypes.instanceOf(null)
работает.
Ответ 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 - это все, что у нас есть, это работает для меня!