React Dynamic Tag with TypeScript
Emotion CSS-in-JS Type declaration 2
Emotion CSS-in-JS Type declaration
emotion
에 적용하기먼저 동적인 태그의 경우, JSX.intrinsicElements
의 키라고 단언을 해준다면, 타입스크립트의 보수적인 추론을 해결할 수 있다.
그러나, Emotion
의 styled-component
는 최종 보스였다. 얘는 도통 추론을 하지 못하더라.
그래서 한 2시간은 헤맨 것 같은데... as
라는 옵션이 있을줄은 꿈에도 몰랐다.
const HeaderText = ({ children, level = 1 }: HeaderTextProps) => {
const HeaderTag = `h${level}` as keyof JSX.IntrinsicElements;
return (
<StyledHeaderTag as={HeaderTag} level={level} HeaderTag={HeaderTag}>
{children}
</StyledHeaderTag>
);
};
이러면, 마치 as
에 있는 태그로 한 마냥 결과가 도출된다.
그렇다면, styled-component
에서는 어떻게 처리했을까?
const StyledHeaderTag: React.FC<HeaderTextProps> = styled.div`
font-size: ${({ level }: { level: LevelTypes }) => {
const fontSizes = {
1: '24px',
2: '18px',
3: '14px',
4: '11px',
};
return fontSizes[level];
}};
font-weight: 700;
`;
그냥 간단하게 div
태그로만 해도, 제대로 엘리먼트가 DOM에서 출력이 되고, 잘 처리할 수 있었다.