TypeScript React 애플리케이션의 PropTypes


121

React.PropTypesTypeScript React 애플리케이션에서 사용하는 것이 합리적 입니까, 아니면 "벨트 및 멜빵"의 경우입니까?

컴포넌트 클래스는 Props유형 매개 변수로 선언되므로 :

interface Props {
    // ...
}
export class MyComponent extends React.Component<Props, any> { ... }

추가하는 것이 실질적인 이점이 있습니까?

static propTypes {
    myProp: React.PropTypes.string
}

클래스 정의에?

답변:


104

일반적으로 구성 요소 소품을 TypeScript 유형으로 동시에 유지하는 데는 그다지 가치가 없습니다 React.PropTypes.

이렇게하는 것이 유용한 경우는 다음과 같습니다.

  • 일반 JavaScript에서 사용할 구성 요소 라이브러리와 같은 패키지를 게시합니다.
  • API 호출의 결과와 같은 외부 입력을 수락하고 전달합니다.
  • 적절하거나 정확한 입력이없는 라이브러리의 데이터를 사용하는 경우.

따라서 일반적으로 컴파일 시간 유효성 검사를 얼마나 신뢰할 수 있는지에 대한 질문입니다.

최신 버전의 TypeScript는 이제 React.PropTypes( PropTypes.InferProps)를 기반으로 유형을 추론 할 수 있지만 결과 유형은 코드의 다른 곳에서 사용하거나 참조하기 어려울 수 있습니다.


1
첫 번째 진술을 설명해 주시겠습니까?
vehsakul

2
@vehsakul 죄송합니다. TypeScript를 사용하지 않는 개발자가 설치할 패키지를 작성하는 경우 런타임에 오류를 얻으려면 여전히 PropTypes가 필요합니다. 프로젝트가 자신 / 다른 TypeScript 프로젝트 전용 인 경우 프로젝트가 단순히 빌드되지 않기 때문에 소품 용 TypeScript 인터페이스로 충분합니다.
Joel 데이

1
이 웹팩 수준에 타이프 라이터 인터페이스에서 PropTypes을 추가하는 POC입니다 github.com/grncdr/ts-react-loader#what-it-does
borN_free

oneOfType을 원합니다-optionalUnion : PropTypes.oneOfType ([PropTypes.string, PropTypes.number, PropTypes.instanceOf (Message)]),-typescript에는 공용체 유형이 있지만 동일한 것을 제공하지 않습니다
Mz A

1
이 작업도 수행하는 라이브러리를 게시했습니다. github.com/joelday/ts-proptypes-transformer TypeScript 컴파일러 변환으로 구현되었으며 깊은 제네릭, 공용체 등에 대한 정확한 propType을 생성합니다. 약간의 거친 가장자리가 있습니다. 어떤 공헌도 훌륭 할 것입니다.
Joel 데이

141

Typescript와 PropType은 다른 용도로 사용됩니다. Typescript는 컴파일 시간에 유형의 유효성을 검사 하는 반면 PropType은 런타임에 확인 됩니다 .

Typescript는 코드를 작성할 때 유용합니다. 잘못된 유형의 인수를 React 구성 요소에 전달하면 경고하고 함수 호출에 대한 자동 완성 기능을 제공합니다.

PropTypes는 구성 요소가 외부 데이터와 상호 작용하는 방식을 테스트 할 때 유용합니다 (예 : API에서 JSON을로드 할 때). PropTypes는 다음과 같은 유용한 메시지를 인쇄하여 구성 요소가 실패한 이유를 디버깅하는 데 도움이됩니다 (React의 개발 모드 일 때).

Warning: Failed prop type: Invalid prop `id` of type `number` supplied to `Table`, expected `string`

Typescript와 PropType이 동일한 작업을 수행하는 것처럼 보이지만 실제로는 전혀 겹치지 않습니다. 그러나 Typescript에서 자동으로 PropType을 생성 할 수 있으므로 유형을 두 번 지정할 필요가 없습니다. 예를 들면 다음과 같습니다.


1
propTypes 및 Typescript 유형이 쉽게 동기화되지 않습니까? 유지 보수 경험이있는 사람이 있습니까?
Leonardo

9
이것은 정답입니다! PropTypes (런타임)는 정적 유형 검사 (컴파일 시간)와 동일하지 않습니다. 따라서 둘 다 사용하는 것은 '무의미한 운동'이 아닙니다.
hans

1
다음은 PropTypes에서 정적 유형을 유추하는 방법에 대한 좋은 설명입니다. dev.to/busypeoples/…
hans

hot reload 및 eslint가있는 vue cli가있는 경우 런타임 대 컴파일 시간이 의미가 없습니다. 저장시 오류가 발생합니다.
Julia

1
@Julia, hot reload는 런타임과 공통점이 없습니다. 핫 리로드를 사용하더라도 API가 실제로 반환 할 내용을 전혀 알 수 없습니다
Kostya Tresko

4

컴파일 타임에 소품의 유형을 추론 할 수없는 지저분한 상황에서는 propTypes런타임에 사용하여 생성 된 경고를 보는 것이 유용 할 것 같습니다 .

이러한 상황 중 하나는 사용자가 제어 할 수없는 외부 API와 같이 유형 정의를 사용할 수없는 외부 소스의 데이터를 처리하는 경우입니다. 내부 API의 경우 아직 사용할 수없는 경우 유형 정의를 작성 (또는 더 잘 생성)하려는 노력의 가치가 있다고 생각합니다.

그 외에는 실제로 어떤 이점도 보지 못합니다 (개인적으로 사용하지 않은 이유입니다).


7
PropTypes 유효성 검사는 동적으로로드 된 데이터 구조의 유효성을 검사하는데도 의미가 있습니다 (AJAX를 통해 서버에서 수신 됨). PropTypes는 런타임 유효성 검사이므로 실제로 디버깅하는 데 도움이 될 수 있습니다. 문제는 명확하고 인간 친화적 인 메시지를 출력합니다.
e1v
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.