reactjs - React + Typescript: props fra `cloneElement` kun
Jeg har en React-komponent <MyComponent> som tar props av typen Props:
interface Props {
name: string;
age: number;
greeting: () => string;
}
export const MyComponent = ({ name, age, greeting }: Props): ReactElement => {
...
}
Men, MyComponent er alltid et barn av WrapperComponent, som er der greeting blir sendt inn:
export const WrapperComponent = ({children}) => {
const thisGreeting = (): void => { console.log('Hello!'); }
return (
<div className="wrapper">
{
Children.map((child) => cloneElement(child, {greeting: thisGreeting}))
}
</div>
);
}
Jeg komponerer for øyeblikket WrapperComponent og MyComponent på denne måten:
<WrapperComponent>
<MyComponent
name="me"
age={99}
/>
</WrapperComponent>
Dette gir en feil, fordi MyComponent mangler greeting, men jeg vet at det vil være der til slutt. greeting er avhengig av den spesifikke forekomsten av WrapperComponent, og derfor er det satt opp på denne måten.
- Dette føles som et lite anti-mønster, siden
MyComponentikke (for øyeblikket) kan brukes utenforWrapperComponent- finnes det en bedre måte? - Hvis ikke (anti-mønster og/eller en bedre måte), finnes det en måte å overbevise TypeScript om at
greetingvil komme dit til slutt?
Svar #1
Du kan erklære greeting-propen som valgfri i Props-grensesnittet. Og sett en standard argumentverdi for den.
interface Props {
name: string;
age: number;
greeting?: () => string;
}
export const MyComponent = ({ name, age, greeting = () => "" }: Props): ReactElement => {
...
}```
Svar #2
// @ts-expect-error er renere etter min mening
… eller hvis du føler dette er for løst, prøv da:
<WrapperComponent>
<MyComponent
name = { undefined as unknown as string }
age = { undefined as unknown as number }
/>
</WrapperComponent>
