javascript - Begränsa typen på en React-komponents prop i Typescript
För att uppnå komposition i vår kodbas skickar vi komponenter som props. Är det möjligt att typkontrollera komponenten som skickas som en prop? Som ett exempel använder jag en Typography-komponent. Denna komponent används i hela kodbasen och skickas som en prop till många andra komponenter.
interface TypographyProps {
variant:
| 'h1'
| 'small'
}
<Thumbnail
name={
<Typography variant="h4">John Doe</Typography>
}
secondaryLine={
<Typography variant="small">Bakerstreet 122</Typography>
}
/>
Jag vill begränsa egenskaperna name och secondaryLine så att de endast kan ta emot Typography-komponenten som en prop. Det skulle vara ännu bättre att begränsa name-propen så att den endast kan ta emot Typography-komponenten med detta specifika variant (h4): <Typography variant="h4">.
För närvarande definierar jag typen så här: name: ReactElement<typeof Typography>;. Det verkar som att varje komponent kan användas som en prop (inte bara Typography-komponenten).
Är det möjligt att begränsa den komponent som skickas som en prop till denna specifika typ?
Svar #1
Eftersom variant är en prop av Typography, kan du specificera Typography.props i Typography-implementeringen:
interface TypographyProps {
variant: 'h1' | 'small',
children: string | JSX.element
}
export const Typography = ({ variant, children }: TypographyProps) => (
<div className={variant}>{ children}</div>
)
