프로젝트의 커짐에 따라 타입검사를 활용하면 많은 버그를 잡을 수 있다. 보통 타입검사를 위해 Flow 또는 TypeScript 와 같은 JavaScript 도구(Extensions)를 사용할 수 있습니다. 이러한 것들을 사용하지 않더라도 React는 내장된 타입 검사 기능들을 가지고 있습니다. 컴포넌트의 props에 타입 검사를 하려면 다음과 같이 특별한 프로퍼티인 propTypes를 선언할 수 있습니다.
PropTypes는 부모로부터 전달받은 prop의 데이터 type을 검사한다. 자식 컴포넌트에서 명시해 놓은 데이터 타입과 부모로부터 넘겨받은 데이터 타입이 일치하지 않으면 콘솔에 에러 경고문이 띄워진다. 간단한 예시를 통해 propTypes의 장점을 알 수 있다.
import PropTypes from 'prop-types'; // PropTypes 를 가져온다
const Greeting = ({ name }) => {
return (
<h1>Hello, {name}</h1>
);
}
//컴포넌트함수이름.propTypes
Greeting.propTypes = {
name: PropTypes.string
// name props가 무슨 타입으로 받아와야 하는지 정의해준다
};
User.propTypes = {
male: PropTypes.bool.isRequired,
//boolean 타입 isRequired: 필수로 받아와야하는 props
age: PropTypes.number,
type: PropTypes.oneOf(["gold", "silver", "bronze"]),
onChangeName: PropTypes.func,
onChangeTitle: PropTypes.func.isRequired
}
MyComponent.propTypes = {
// 리액트 요소
// <div>123</div> , <Component />
menu: PropTypes.element,
// 컴포넌트 함수가 반환할 수 있는 모든 것(비추)
// <SomeComponent />, 123
description: PropTypes.node,
// Message 클래스로 생성된 모든 객체
// new Messages() -> 참, new Car() -> 거짓
message: PropTypes.instanceOf(Message),
// 배열에 포함된 값 중에서 하나를 만족
name: PropTypes.oneOf(["jake", "olivia"]),
// 배열에 포함된 타입 중에서 하나를 만족
width: PropTypes.oneOfType([PropTypes.number, PropTypes.string])
// 특정 타입만 포함하는 배열
// [1, 5, 7] -> 참, ['a', 'b'] -> 거짓
ages: PropTypes.arrayOf(PropTypes.number),
// 객체의 속성값 타입을 정의
// {color: 'red', weight: 123} -> 참
info: PropTypes.shape({
color: PropTypes.string,
weight: PropTypes.number
})
// 객체에서 모든 속성값의 타입이 같은 경우
// {prop1: 123, prop2: 456}
infos: PropTypes.objectOf(PropTypes.number)
}