Do you want to request a feature or report a bug?
bug, or missing feature rather, that should be there
What is the current behavior?
I can't define a prop as isRequired when using custom validation
Simple stateless component that demonstrates the issue
const Component = ({ content }) => <div>{content}</div>
Component.propTypes = {
  content: (props, propName, componentName) => {
    if (props.content === "I'll allow it!") {
      return null;
    }
    return new Error(`Content ${content} is not allowed!`);
  }
}
What is the expected behavior?
I can, somehow, define a prop as required after
Which versions of React, and which browser / OS are affected by this issue? Did this work in previous versions of React?
In the simplified example I posted, I couldn't find any way of adding isRequired to that prop, either by adding it at the end of the function, abstracting the validation function away, or even returning this to chain it (it has to return null or an Error).
Hi! It seems like you're under the impression that isRequired is something that React adds to your prop types at runtime, but it's really just a convention that the built-in prop types all support. If you want this functionality in your custom prop types, you have to add that yourself.
Here's an example of how you can add isRequired to your own custom validators:
// This is a factory function (also called a higher-order function)
function createCustomPropType(isRequired) {
  // The factory returns a custom prop type
  return function(props, propName, componentName) {
    const prop = props[propName];
    if (prop == null) {
      // Prop is missing
      if (isRequired) {
        // Prop is required but wasn't specified. Throw an error.
        throw new Error();
      }
      // Prop is optional. Do nothing.
    } else {
      // Put your validation logic here...
    }
  }
}
// Using the factory, create two different versions of your prop type
const customPropType = createCustomPropType(false);
customPropType.isRequired = createCustomPropType(true);
// Now this will work:
MyComponent.propTypes = {
  optional: customPropType,
  required: customPropType.isRequired,
};
This is essentially how React's built-in prop types do it, too: https://github.com/facebook/react/blob/master/src/isomorphic/classic/types/ReactPropTypes.js#L157-L223
Hope that helps!
Thanks @acdlite, this is exactly what I was looking for, and you're right, I was under the impression that React was doing some sort of runtime analysis on those isRequired tidbits.
I think it's worthwhile to update the docs on this regard with the example you posted, or something along the lines. What do you think?
@acdlite thanks, works perfectly for me : )
Most helpful comment
Hi! It seems like you're under the impression that
isRequiredis something that React adds to your prop types at runtime, but it's really just a convention that the built-in prop types all support. If you want this functionality in your custom prop types, you have to add that yourself.Here's an example of how you can add
isRequiredto your own custom validators:This is essentially how React's built-in prop types do it, too: https://github.com/facebook/react/blob/master/src/isomorphic/classic/types/ReactPropTypes.js#L157-L223
Hope that helps!