reactjs - Error TS2322 al extender Button, propiedad del componente no encontrada. ¿Cuál es la forma correcta de tipar?
Estoy migrando de MUI v3 a v4. Tengo algunos componentes Button envueltos que extienden algunos estilos y otras propiedades del componente Button habitual de Material UI. Desde que actualicé a v4, recibo errores de tipo con esto. Estoy utilizando react-router-dom como mi biblioteca de enrutamiento.
Al pasar los componentes de referencia reenviada como se muestra en el ejemplo actualizado de Button en la documentación de MUI v4 (aquí: https://material-ui.com/components/buttons/#third-party-routing-library) obtengo un error de tipo que indica que component no existe en el tipo de props que he proporcionado para mi botón envuelto.
He probado varias combinaciones de tipos del componente Button para ver si algo más podría funcionar, pero parece que ButtonProps debería cubrirlo según el tipo OverrideProps del que se construye ButtonProps.
Aquí está mi reproducción en code sandbox:
https://codesandbox.io/s/mui-button-type-issue-dihdd?from-embed
Nota: Toma un minuto para que los errores de tipo aparezcan mientras Code Sandbox procesa los tipos.
Respuesta #1
Esto está sucediendo por dos razones:
ExtendedButtoncontiene unMUIButton(que tiene la propiedadcomponent), peroExtendedButtonno es unMUIButtonen sí mismo (por lo que no tiene la propiedadcomponent).- La propiedad
componentestá definida enOverridableComponent, no enOverrideProps.
Necesitas implementar la propiedad del componente y pasarla a MUIButton:
const Button: React.FC<Props & { component: React.ElementType }> = ({
component,
// ...
}) => (
<MUIButton
component={component}
// ...
>
// ...
</MUIButton>
)
Como referencia, aquí es donde se define component en MUI:
export interface OverridableComponent<M extends OverridableTypeMap> {
<C extends React.ElementType>(props: { component: C } & OverrideProps<M, C>): JSX.Element;
(props: DefaultComponentProps<M>): JSX.Element;
}
