[reactjs] TypeScript 및 React-어린이 유형?

다음과 같이 매우 간단한 기능 구성 요소가 있습니다.

import * as React from 'react';

export interface AuxProps  {
    children: React.ReactNode
 }


const aux = (props: AuxProps) => props.children;

export default aux;

그리고 또 다른 구성 요소 :

import * as React from "react";

export interface LayoutProps  {
   children: React.ReactNode
}

const layout = (props: LayoutProps) => (
    <Aux>
        <div>Toolbar, SideDrawer, Backdrop</div>
        <main>
            {props.children}
        </main>
    <Aux/>
);

export default layout;

다음과 같은 오류가 계속 발생합니다.

[ts] JSX 요소 유형 ‘ReactNode’는 JSX 요소에 대한 생성자 함수가 아닙니다. ‘undefined’유형은 ‘ElementClass’유형에 할당 할 수 없습니다. [2605]

올바르게 입력하려면 어떻게합니까?



답변

다만 children: React.ReactNode


답변

<Aux>JSX에서 사용하려면 을 반환하는 함수 여야합니다 ReactElement<any> | null. 이것이 함수 컴포넌트 의 정의입니다 .

그러나 현재 React.ReactNode는 훨씬 더 넓은 유형 인를 반환하는 함수로 정의되어 있습니다. React 타이핑은 다음과 같이 말합니다.

type ReactNode = ReactChild | ReactFragment | ReactPortal | boolean | null | undefined;

반환 된 값을 React Fragment ( <></>) 에 래핑하여 원하지 않는 유형이 중화되었는지 확인합니다 .

const aux: React.FC<AuxProps> = props =>
  <>{props.children}</>;


답변

이것은 나를 위해 일한 것입니다.

interface Props {
  children: JSX.Element[] | JSX.Element
}

편집children: React.ReactNode 대신 지금 사용 하는 것이 좋습니다 .


답변

다음과 같이 구성 요소를 선언 할 수 있습니다.

const MyComponent: React.FunctionComponent = (props) => {
    return props.children;
}


답변

ReactChildrenReactChild다음을 사용할 수 있습니다 .

import React, { ReactChildren, ReactChild } from 'react';

interface AuxProps {
  children: ReactChild | ReactChildren;
}

const Aux = ({ children }: AuxProps) => (<div>{children}</div>);

export default Aux;


답변

TypeScript 사이트에서 : https://github.com/Microsoft/TypeScript/issues/6471

권장되는 방법은 소품 유형을 {children ?: any}로 작성하는 것입니다.

그것은 나를 위해 일했습니다. 자식 노드는 여러 가지가 될 수 있으므로 명시 적 타이핑은 대소 문자를 놓칠 수 있습니다.

https://github.com/Microsoft/TypeScript/issues/13618 에서 후속 문제에 대한 더 긴 논의가 있지만 모든 접근 방식은 여전히 ​​작동합니다.


답변

함수 구성 요소 반환 유형은 JSXElement | nullTypeScript 로 제한됩니다 . 이것은 현재 유형 제한이며 순수한 React 는 더 많은 것을 허용합니다. 반환 유형을 합니다.

최소 데모 스 니펫

해결 방법으로 유형 어설 션 또는 조각을 사용할 수 있습니다.

const Aux = (props: AuxProps) => <>props.children</>;
const Aux2 = (props: AuxProps) => props.children as ReactElement; 

ReactNode

children: React.ReactNode에 대한 강력한 유형을 갖는 것이 목표 인 경우 차선책 일 수 있습니다 Aux.

거의 모든 것을 현재 ReactNode유형에 할당 할 수 있습니다 {} | undefined | null. 케이스에 대한 더 안전한 유형은 다음과 같습니다.

interface AuxProps {
  children: ReactElement | ReactElement[]
}

예:

을 감안할 Aux필요는 요소 반작용 children, 우리가 실수로 추가 string그것입니다. 그런 다음 위의 솔루션 은 이와 대조적으로 오류가 발생 ReactNode합니다. 연결된 놀이터를 살펴보십시오.

Typed childrenRender Prop 콜백 과 같은 비 JSX props에도 유용합니다 .