Поскольку JavaScript является динамически типизированным языком, у нас нет способа принудительно применить тип переменной во время компиляции.
Flow и TypeScript очень помогают в данном случае, но React сам может помочь с типизацией props
, а инструменты (редакторы, линтеры) могут помочь обнаружить, когда мы передаем неправильные значения еще перед запуском кода:
import PropTypes from "prop-types";
import React from "react";
class BlogPost extends React.Component {
render() {
return (
<div>
<h1>{this.props.title}</h1>
<p>{this.props.description}</p>
</div>
);
}
}
BlogPost.propTypes = {
title: PropTypes.string,
description: PropTypes.string
};
export default BlogPost;
Какие типы мы можем использовать
Основные типы:
- PropTypes.array
- PropTypes.bool
- PropTypes.func
- PropTypes.number
- PropTypes.object
- PropTypes.string
- PropTypes.symbol
Мы можем указать один из двух типов:
PropTypes.oneOfType([
PropTypes.string,
PropTypes.number
]),
Мы можем указать одно из многих значений:
PropTypes.oneOf(['Test1', 'Test2']),
Мы можем указать экземпляр класса:
PropTypes.instanceOf(Something);
Мы можем указать любой React node
(всё что React может отобразить): числа, строки, элементы или массив (фрагмент).
PropTypes.node;
Или вообще любой тип:
PropTypes.any;
Массивы имеют специальный синтаксис, который мы можем использовать для принятия массива определенного типа:
PropTypes.arrayOf(PropTypes.string);
Объект принимает определенную форму:
PropTypes.shape({
color: PropTypes.string,
fontSize: PropTypes.number
});
Свойсто isRequired
Добавление isRequired
к любому параметру PropTypes приведет к тому, что React вернет ошибку, если это свойство отсутствует, так как делает его обязательным:
PropTypes.arrayOf(PropTypes.string).isRequired,
PropTypes.string.isRequired,