Skip to content

Instantly share code, notes, and snippets.

@capJavert
Created October 8, 2020 20:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save capJavert/92dc35fe2ea387cc7f769140f426ae45 to your computer and use it in GitHub Desktop.
Save capJavert/92dc35fe2ea387cc7f769140f426ae45 to your computer and use it in GitHub Desktop.
Require at least one of provided props
import PropTypes from 'prop-types'
/**
* Require at least one of provided props
*
* @example
*
* const requireOneOfProps = requireOneOf({
* entity: PropTypes.string,
* entities: PropTypes.arrayOf(PropTypes.string)
* })
*
* Component.propTypes = {
* entity: requireOneOfProps,
* entities: requireOneOfProps
* }
*
* @param {Object} propsToCheck
* @returns {Function}
*/
const requireOneOf = propsToCheck => {
return (props, propName, compName) => {
const requirePropNames = Object.keys(propsToCheck)
const found = requirePropNames.find(propRequired => props[propRequired])
try {
if (!found) {
throw new Error(`One of ${requirePropNames.join(',')} is required by '${compName}' component.`)
}
PropTypes.checkPropTypes(propsToCheck, props, propName, compName)
} catch (e) {
return e
}
return null
}
}
export { requireOneOf }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment