reactjs - Hvordan erklære type korrekt for React wrapper-komponent (HOC) ved bruk av Typescript
Jeg prøver å implementere en enkel HOC for å forbedre komponenter med egendefinerte verktøytips. Selv om koden fungerer fint, klarer jeg ikke å finne ut hvordan jeg riktig skal erklære typer. En forenklet versjon av min HOC ser slik ut:
const withTooltip = <P extends {}>(
BaseComponent: React.ComponentType<P>
): React.FC<P & { title?: string }> => ({ title, ...rest }) => {
return (
<>
<BaseComponent {...rest} />
<Tooltip title={title}/>
</>
);
};
Men jeg får en Typescript-feil:
Type 'Omit<PropsWithChildren<P & { title?: string | undefined; }>, "title">' is not assignable to type 'IntrinsicAttributes & P & { children?: ReactNode; }'.
Type 'Omit<PropsWithChildren<P & { title?: string | undefined; }>, "title">' is not assignable to type 'P'.
'Omit<PropsWithChildren<P & { title?: string | undefined; }>, "title">' is assignable to the constraint of type 'P', but 'P' could be instantiated with a different subtype of constraint '{}'.
Hvordan kan jeg korrekt deklarere typer for en slik HOC?
Svar #1
Du må bruke typen av infererte rest-props:
import React, { ComponentType } from 'react'
const Tooltip = (props: { title?: string }) => null
type OptionalTitle = { title?: string };
const withTooltip = <P extends object = object>(
BaseComponent: ComponentType<Omit<P & OptionalTitle, "title">>
): React.FC<P & OptionalTitle> => ({ title, ...rest }) => {
return (
<>
<BaseComponent {...rest} />
<Tooltip title={title} />
</>
);
};
