[React]PropTypes

juu·2023년 4월 5일
0

React

목록 보기
2/2
post-thumbnail

TypeScript를 사용하지 않고도 props의 타입을 지정할 수 있는 라이브러리
React에 내장된 라이브러리로 Props의 타입 검사를 할 수 있다.

사용법은 간단하다.
아래의 코드 처럼 PropTypes를 import해서 사용하면 된다.

import PropTypes from 'prop-types';

function HelloWorldComponent({ name }) {
  return (
    <div>Hello, {name}</div>
  )
}

HelloWorldComponent.propTypes = {
  name: PropTypes.string
}

export default HelloWorldComponent

만약 여러개의 타입과 필수값을 넣고 싶다면?

import PropTypes from 'prop-types';

function HelloWorldComponent({ name ,age}) {
  return (
    <div>Hello, Im {name}, {age} years old</div>
  )
}

HelloWorldComponent.propTypes = {
  name: PropTypes.string.isRequired,
  age : PropTypes.number.isRequired
}

export default HelloWorldComponent

타입을 작성하고 뒤에 .isRequired 를 작성해주면 된다.

📍 데이터 타입을 쓰기 전에 PropTyes을 써줘야한다.
많이 사용하는 배열을 마지막 예로 들며 마치겠습니다..
배열의 경우 어떤 데이터타입의 배열인지 타입검사를 하고 싶은 경우에,

HelloWorldComponent.propTypes = {
  name: PropTypes.string.isRequired,
  age : PropTypes.number.isRequired
  friends : PropTypes.arrayOf(PropTypes.string).inRequired
}

이런 식으로 적어주면 타임 검사가 가능하다.
아래의 글을 참고해놨지만 공식문서가 제일 보기 편하고 자세히 나와있다.
👉🏻 React PropType 공식문서 보러가기

간단하게 타입 검사를 하기에 유용할 것 같아 글로 정리해봤다.
TS를 활용하면 좋긴하지만 아직 TS의 활용이 조금 미숙해 간단한 프로젝트를 사용할 때는 유용할 것 같다.
또한, React 내장라이브러리에 새삼 뭐가 많다는 것을 다시 한번 느꼈다 :)

그 외의 여러 데이터타입에 관한 정보가 있으니 필요에 맞게 사용하면 된다.

import PropTypes from 'prop-types';

MyComponent.propTypes = {
  // prop가 특정 JS 형식임을 선언할 수 있습니다.
  // 이것들은 기본적으로 모두 선택 사항입니다.
  optionalArray: PropTypes.array,
  optionalBool: PropTypes.bool,
  optionalFunc: PropTypes.func,
  optionalNumber: PropTypes.number,
  optionalObject: PropTypes.object,
  optionalString: PropTypes.string,
  optionalSymbol: PropTypes.symbol,

  // 렌더링 될 수 있는 것들은 다음과 같습니다.
  // 숫자(numbers), 문자(strings), 엘리먼트(elements), 또는 이러한 타입들(types)을 포함하고 있는 배열(array) (혹은 배열의 fragment)
  optionalNode: PropTypes.node,

  // React 엘리먼트.
  optionalElement: PropTypes.element,

  // React 엘리먼트 타입 (ie. MyComponent)
  optionalElementType: PropTypes.elementType,

  // prop가 클래스의 인스턴스임을 선언할 수 있습니다.
  // 이 경우 JavaScript의 instanceof 연산자를 사용합니다.
  optionalMessage: PropTypes.instanceOf(Message),

  // 열거형(enum)으로 처리하여 prop가 특정 값들로 제한되도록 할 수 있습니다.
  optionalEnum: PropTypes.oneOf(['News', 'Photos']),

  // 여러 종류중 하나의 종류가 될 수 있는 객체
  optionalUnion: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.number,
    PropTypes.instanceOf(Message)
  ]),

  // 특정 타입의 행렬
  optionalArrayOf: PropTypes.arrayOf(PropTypes.number),

  // 특정 타입의 프로퍼티 값들을 갖는 객체
  optionalObjectOf: PropTypes.objectOf(PropTypes.number),

  // 특정 형태를 갖는 객체
  optionalObjectWithShape: PropTypes.shape({
    color: PropTypes.string,
    fontSize: PropTypes.number
  }),

  // 추가 프로퍼티에 대한 경고가 있는 객체
  optionalObjectWithStrictShape: PropTypes.exact({
    name: PropTypes.string,
    quantity: PropTypes.number
  }),

  // 위에 있는 것 모두 `isRequired`와 연결하여 prop가 제공되지 않았을 때
  // 경고가 보이도록 할 수 있습니다.
  requiredFunc: PropTypes.func.isRequired,

  // 모든 데이터 타입이 가능한 필수값
  requiredAny: PropTypes.any.isRequired,

  // 사용자 정의 유효성 검사기를 지정할 수도 있습니다.
  // 검사 실패 시에는 에러(Error) 객체를 반환해야 합니다.
  // `oneOfType`안에서는 작동하지 않으므로 `console.warn` 혹은 throw 하지 마세요.
  customProp: function(props, propName, componentName) {
    if (!/matchme/.test(props[propName])) {
      return new Error(
        'Invalid prop `' + propName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  },

  // `arrayOf` 와 `objectOf 에 사용자 정의 유효성 검사기를 적용할 수 있습니다.
  // 검사 실패 시에는 에러(Error) 객체를 반환해야 합니다.
  // 유효성 검사기는 배열(array) 혹은 객체의 각 키(key)에 대하여 호출될 것입니다.
  // 유효성 검사기의 첫 두 개의 변수는 배열 혹은 객체 자신과 현재 아이템의 키입니다.

  customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
    if (!/matchme/.test(propValue[key])) {
      return new Error(
        'Invalid prop `' + propFullName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  })
};

0개의 댓글