reactjs - Specificera vissa HTML-taggar som generisk styled-komponent i TypeScript
Jag försökte bygga en generisk emotion-stylad komponent som rubrik i React med TypeScript. Målet är att dynamiskt skicka HTML-taggen som props, vilket endast ska vara en "h1" | "h2" | "h3" | "h4" | "h5" | "h6". Det här är min kod:
interface Props extends StyledProps {
tag: keyof JSX.IntrinsicElements; // TODO specify only heading
}
export const CenteredHeadline: React.FC<Props> = ({
tag,
fontSizeMobile,
fontSizeDesktop,
children,
}) => {
const StyledComponent = styled(tag)<StyledProps>`
label: CenteredHeadline;
color: #3f4846;
font-size: ${(props) => (props.fontSizeMobile ? 'props.fontSizeMobile' : '34px')};
text-align: center;
@media screen and (min-width: 768px) {
font-size: ${(props) => (props.fontSizeDesktop ? 'props.fontSizeDesktop' : '40px')};
max-width: 750px;
}
`;
return (
<StyledComponent fontSizeMobile={fontSizeMobile} fontSizeDesktop={fontSizeDesktop}>
{children}
</StyledComponent>
);
};
Koden ovan fungerar bra hittills, men tagg-egenskapen är inte begränsad till att bara vara en rubrik.
Jag försökte något liknande detta
interface Props extends StyledProps {
tag:
| JSX.IntrinsicElements['h1']
| JSX.IntrinsicElements['h2']
| JSX.IntrinsicElements['h3']
| JSX.IntrinsicElements['h4']
| JSX.IntrinsicElements['h5']
| JSX.IntrinsicElements['h6']; // TODO specify only heading
}
vilket ledde till en massa fel i min emotionprop (tagg).
Så frågan är mer typescript-relaterad, antar jag:
Finns det ett sätt att specificera vissa nycklar i keyof something, JSX.IntrinsicElements i mitt fall?
Tack för all hjälp!
UPPDATERING
Jag hittar ett sätt att specificera tangenterna:
type Tag = Pick<JSX.IntrinsicElements, "h1" | "h2">
const StyledComponent = styled<Tag>(tag)<StyledProps>`
...
Men jag kommer att få ett fel i min stilade komponent som säger
Typen 'Tag' uppfyller inte begränsningen 'keyof IntrinsicElements'
Så jag antar att problemet nu skickas till känslan.
Jag är fortfarande glad för alla tips här. =)
Svar #1
Varför inte helt enkelt: type Tag="h1" | "h2" | "h3" | ....