Да, вам нужно проверять типы реквизита даже при использовании prop-types
. Библиотека prop-types
выдает предупреждения во время выполнения в режиме разработки React.
В приведенном ниже примере мы используем сборку разработки React. У нас есть компонент H1
с необходимой функцией prop. Обратите внимание, что при использовании компонента H1
в App
без передачи значения для className
выдается ошибка, и prop-types
зарегистрировали предупреждение.
Таким образом, вы не можете положиться на prop-types
, чтобы предотвратить передачу плохих реквизитов детям.
function H1({ className, children }) {
// this will throw if className is not a function
return <h1 className={className()}>{children}</h1>
}
H1.propTypes = {
className: PropTypes.func.required
}
function App() {
return <H1>Test</H1>
}
ReactDOM.render(<App />, document.querySelector("#root"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/prop-types/15.7.2/prop-types.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.development.js"></script>
<div id=root></div>
Чтобы предотвратить подобные вещи во время выполнения, вы можете:
- объявить значение по умолчанию для пропеллера
- сделать проверку на значение реквизита в компоненте
Еще лучше, вы можете сделать оба, как в примере ниже:
function H1({ className, children }) {
/* do some validation of your props
(throwing here to demonstrate that the default prop set below
works - I do not recommend throwing errors within components
like this unless you know what you're doing, e.g. have an error
boundary to catch behaviour like this) */
if (typeof className !== "function") {
throw new Error("expecting className prop to be function")
}
return <h1 className={className()}>{children}</h1>
}
H1.propTypes = {
className: PropTypes.func.required
}
H1.defaultProps = {
className: () => ""
}
function App() {
return <H1>Test</H1>
}
ReactDOM.render(<App />, document.querySelector("#root"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/prop-types/15.7.2/prop-types.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.development.js"></script>
<div id=root></div>
Таким образом, ваше приложение не обработает sh из-за неправильного значения пропа, и в режиме разработки вы увидите предупреждение, записанное prop-types
.