요구사항은 다음과 같다.
사용했을 때 결과값은 다음과 같다.
const Text = () => {};
export default function Index() {
return <>
<Text as="h1">Heading1 Text</Text> -> <h1>Heading1 Text</h1>
<Text as="div">Div Text</Text> -> <div>Div Text</div>
<Text>span text</Text> -> <span>span text</span>
</>;
}
const Text = ({ as, children }) => {
const Component = as || 'span';
return <Component>{children}</Component>;
};
export default function Index() {
return (
<>
<Text as='h1'>Heading1 Text</Text>
<Text as='div'>Div Text</Text>
<Text>span text</Text>
</>
);
}
제네릭을 사용하여 props 타입을 지정한다.
type TextProps<T extends React.ElementType> = {
as?: T;
children: React.ReactNode;
};
우리가 전달하는 element에 따라서 element의 attributes도 함께 전달하고 사용할 수 있어야 한다.
type TextProps<T extends React.ElementType> = {
as?: T;
children: React.ReactNode;
} & Omit<React.ComponentPropsWithoutRef<T>, 'as' | 'children'>;
Text 컴포넌트의 타입을 지정해준다.
const Text = <C extends React.ElementType>({ as, children, ...rest }: TextProps<C>) => {
const Component = as || 'span';
return <Component {...rest}>{children}</Component>;
};
import React from 'react';
type TextProps<T extends React.ElementType> = {
as?: T;
children: React.ReactNode;
} & Omit<React.ComponentPropsWithoutRef<T>, 'as' | 'children'>;
const Text = <C extends React.ElementType>({ as, children, ...rest }: TextProps<C>) => {
const Component = as || 'span';
return <Component {...rest}>{children}</Component>;
};
export default function Index() {
return (
<>
<Text as='h1'>Heading1 Text</Text>
<Text as='div'>Div Text</Text>
<Text as='a' href='www.naver.com'>
Link Text
</Text>
<Text>span text</Text>
</>
);
}