PropTypes

https://reactjs.org/docs/typechecking-with-proptypes.html

Type Checking


Type checking is an important principle in programming.

JavaScript lets you get away with a lot of potentially hazardous coding practices. Consider the following:

When you code let a = 1 and then let a = 2, JavaScript yells at you and breaks. But when you code var b = 1 and then var b = 2, JavaScript lets you get away with it.

var use to be our only option. Why would we want to use let when it's more likely to break our code?

It's because it breaks it early instead of later, becoming a deeper issue. We're able to say, "Oh yeah! I did want that variable to be this. Thank you for breaking my code and telling me later instead of me being confused that my variable values aren't what I expect them to be"

With PropTypes, we are able to say, "I expect this prop to be a string, and this one to be a number, and if it's not, let me know."

Installation

PropTypes are not part of React, but are extremely common. If you used Create React App, you already have it and you just need to

import PropTypes from "prop-types"

at the top of any file you're using it in.

If you don't have it, you'll need to install it too.

npm install --save prop-types

Now at the bottom of a component file that is expecting to receive props, you will name the component and assign PropTypes by giving that component another property called propTypes.

import PropTypes from 'prop-types'

class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
      <h2>You are {this.props.age} years old</h2> 
    )
  }
}

Greeting.propTypes = {
  name: PropTypes.string,
  age: PropTypes.string
}

Here, we are saying, "I am expecting the name prop to be a string."

Check the docs for what else you're able to expect a prop to be:
https://reactjs.org/docs/typechecking-with-proptypes.html

Options include:

  • array
  • boolean (bool)
  • function (func)
  • number
  • object
  • string
  • symbol
  • node (Anything that can be rendered: numbers, strings, elements or an array)
  • element (A React element)

You're also able to make sure an object fits a specific shape:

ComponentName.propTypes = {
  NameOfPropThatIAnOptionalObjectWithSpecificShape: PropTypes.shape({
    color: PropTypes.string,
    fontSize: PropTypes.number
  })
}

And make sure things are required:

requiredString: PropTypes.string.isRequired,

You are also able set default prop values. Which is hecka cool.

Greeting.defaultProps = {
  name: 'Stranger'
}

So, if you don't want to pass in a prop, that component will receive a prop. And that that prop can easily be overwritten if you want it to be.

Start using PropTypes in your components. You'll write much more manageable code if you do, and many companies require it.