Typescript + Emotion Styled no infiere el tipo del componente como un prop.
En Typescript, cuando se utiliza la función `styled` de Emotion para estilizar un componente, es posible que no se infiera automáticamente el tipo del componente como un prop. Esto significa que si se intenta acceder a propiedades específicas del componente dentro del styled component, se pueden producir errores de tipos.
Sin embargo, es posible solucionar este problema utilizando la función `PropsWithChildren`. Esta función envuelve el tipo del componente y asegura que los props pasados al styled component sean correctamente reconocidos y verificados por Typescript.
Aquí hay un ejemplo de cómo se puede utilizar la función `PropsWithChildren` para inferir el tipo del componente como un prop en Typescript + Emotion Styled:
“`tsx
import React, { PropsWithChildren } from “react”;
import { styled } from “@emotion/styled”;
// Componente funcional
type MyComponentProps = {
myProp: string;
};
const MyComponent: React.FC = ({ myProp }) => {
return {myProp};
};
// Styled Component
type StyledMyComponentProps = PropsWithChildren;
const StyledMyComponent = styled(MyComponent)`
color: red;
`;
// Uso del Styled Component
const App: React.FC = () => {
return ;
};
“`
En este ejemplo, hemos definido un componente funcional `MyComponent` con un prop `myProp`. Luego, hemos creado el `StyledMyComponent` utilizando la función `styled`, y hemos utilizado `PropsWithChildren` para envolver el tipo del componente como un prop.
Finalmente, en el componente `App`, hemos utilizado el `StyledMyComponent` y le hemos pasado el prop `myProp` correctamente verificado por Typescript.
Al utilizar `PropsWithChildren`, aseguramos que el tipo del componente sea inferido de manera correcta y evitamos posibles errores de tipos al acceder a propiedades específicas del componente dentro del styled component.
{myProp}
;
};
// Styled Component
type StyledMyComponentProps = PropsWithChildrenTengo un componente de Botón simple.
Cuando lo uso, puedo pasar la propiedad “AS” de esta manera:
Pero cuando intento obtener la propiedad “href”, no funciona. Los tipos del elemento “Anchor” no se deducen y Typescript muestra un error diciendo que el atributo “href” no existe en este componente.
davy.ai
La razón de este error es porque TypeScript está inferiendo las props basándose en el componente
Button
en lugar del elementoa
. Para resolver este problema, puedes declarar manualmente la prophref
en la interfaz del componenteButton
o usar una afirmación de tipo para indicarle a TypeScript que el componente debe ser tratado como un elementoa
.Aquí tienes cómo puedes declarar manualmente la prop
href
en la interfaz:Alternativamente, puedes usar una afirmación de tipo para indicarle a TypeScript que el componente debe ser tratado como un elemento
a
:Al pasar
null as any
como las props spread, le estamos diciendo a TypeScript que ignore cualquier error de tipo y trate el componente como un elementoa
.Cualquiera de los enfoques te permitirá pasar la prop
href
al componenteButton
.