What is prop-types?
The prop-types package is used for runtime type checking of the props that a React component receives. It helps in documenting the intended types of properties passed to components and catching errors in development if a component receives props of incorrect types.
What are prop-types's main functionalities?
Typechecking with PropTypes
This code demonstrates how to use PropTypes to define type requirements for a React component's props. It specifies that the 'name' prop is required and must be a string, 'age' must be a number, 'onButtonClick' should be a function, 'children' should be a React node, 'style' should be an object with numeric values, and 'items' should be an array of strings.
{"Component.propTypes = { name: PropTypes.string.isRequired, age: PropTypes.number, onButtonClick: PropTypes.func, children: PropTypes.node, style: PropTypes.objectOf(PropTypes.number), items: PropTypes.arrayOf(PropTypes.string) };"}
Default Prop Values
This code provides default values for props in a React component. If 'age', 'onButtonClick', or 'items' are not provided by the parent component, they will default to 30, a no-op function, and an empty array, respectively.
{"Component.defaultProps = { age: 30, onButtonClick: () => {}, items: [] };"}
Custom Validators
This code shows how to define a custom validator for a prop. If the 'customProp' does not match the specified pattern, a validation error will be thrown.
{"Component.propTypes = { customProp: function(props, propName, componentName) { if (!/matchme/.test(props[propName])) { return new Error('Validation failed!'); } } };"}
Other packages similar to prop-types
typescript
TypeScript is a superset of JavaScript that adds static type definitions. Unlike prop-types, TypeScript checks types at compile time rather than at runtime. This can help catch errors earlier in the development process and provides a more robust type system.
flow-bin
Flow is a static type checker for JavaScript developed by Facebook. Similar to TypeScript, it checks types at compile time. Flow can be used with React to ensure that props and state are of the correct types, offering a similar level of type safety to TypeScript.
io-ts
io-ts is a runtime type system for IO decoding/encoding. It is similar to prop-types in that it performs runtime type checking, but it also provides the ability to define types for data structures and validate data at the boundaries of the system, such as API responses.
tcomb
tcomb is a library for type checking and DDD (Domain Driven Design). It allows you to define types and interfaces and can be used for prop validation in React components. It offers more features than prop-types, such as refinement types and combinators, but it is also more complex.
prop-types
Runtime type checking for React props and similar objects.
Installation
npm install --save prop-types
Importing
import PropTypes from 'prop-types';
var PropTypes = require('prop-types');
If you prefer a <script>
tag, you can get it from window.PropTypes
global:
<script src="https://unpkg.com/prop-types/prop-types.js"></script>
<script src="https://unpkg.com/prop-types/prop-types.min.js"></script>
How to Depend on This Package?
For apps, we recommend putting it in dependencies
with a caret range.
For example:
"dependencies": {
"prop-types": "^15.5.0"
}
For libraries, we also recommend leaving it in dependencies
:
"dependencies": {
"prop-types": "^15.5.0"
},
"peerDependencies": {
"react": "^15.5.0"
}
Just make sure that the version range uses a caret (^
) and thus is broad enough for npm to efficiently deduplicate packages.
Compatibility
React 14
This package is compatible with React 0.14.9. Compared to 0.14.8 (which was released a year ago), there are no other changes in 0.14.9, so it should be a painless upgrade.
# ATTENTION: Only run this if you still use React 0.14!
npm install --save react@^0.14.9 react-dom@^0.14.9
React 15+
This package is compatible with React 15.3.0 and higher.
npm install --save react@^15.3.0 react-dom@^15.3.0
What happens on other React versions?
It outputs warnings with the message below even though the developer doesn’t do anything wrong. Unfortunately there is no solution for this other than updating React to either 15.3.0 or higher, or 0.14.9 if you’re using React 0.14.
Difference from React.PropTypes
: Don’t Call Validator Functions
First of all, which version of React are you using? You might be seeing this message because a component library has updated to use prop-types
package, but your version of React is incompatible with it. See the above section for more details.
Are you using either React 0.14.9 or a version higher than React 15.3.0? Read on.
When you migrate components to use the standalone prop-types
, all validator functions will start throwing an error if you call them directly. This makes sure that nobody relies on them in production code, and it is safe to strip their implementations to optimize the bundle size.
Code like this is still fine:
MyComponent.propTypes = {
myProp: PropTypes.bool
};
However, code like this will not work with the prop-types
package:
var errorOrNull = PropTypes.bool(42, 'myProp', 'MyComponent', 'prop');
It will throw an error:
Calling PropTypes validators directly is not supported by the `prop-types` package.
Use PropTypes.checkPropTypes() to call them.
(If you see a warning rather than an error with this message, please check the above section about compatibility.)
This is new behavior, and you will only encounter it when you migrate from React.PropTypes
to the prop-types
package. For the vast majority of components, this doesn’t matter, and if you didn’t see this warning in your components, your code is safe to migrate. This is not a breaking change in React because you are only opting into this change for a component by explicitly changing your imports to use prop-types
. If you temporarily need the old behavior, you can keep using React.PropTypes
until React 16.
If you absolutely need to trigger the validation manually, call PropTypes.checkPropTypes()
. Unlike the validators themselves, this function is safe to call in production, as it will be replaced by an empty function:
PropTypes.checkPropTypes(MyComponent.propTypes, props, 'prop', 'MyComponent');
You might also see this error if you’re calling a PropTypes
validator from your own custom PropTypes
validator. In this case, the fix is to make sure that you are passing all of the arguments to the inner function. There is a more in-depth explanation of how to fix it on this page. Alternatively, you can temporarily keep using React.PropTypes
until React 16, as it would still only warn in this case.
If you use a bundler like Browserify or Webpack, don’t forget to follow these instructions to correctly bundle your application in development or production mode. Otherwise you’ll ship unnecessary code to your users.
Usage
Refer to the React documentation for more information.
Migrating from React.PropTypes
Check out Migrating from React.PropTypes for details on how to migrate to prop-types
from React.PropTypes
.