Estou tentando consertar um pedaço de código TSX que compartilha uma interface prop entre um componente React e um styled <div>
, porque o styled <div>
gera avisos como este:
Aviso: O React não reconhece o
aA
prop em um elemento DOM. Se você quiser intencionalmente que ele apareça no DOM como um atributo personalizado, escreva-o em letras minúsculasaa
. Se você o passou acidentalmente de um componente pai, remova-o do elemento DOM.
O código se parece com isto:
// Comp.tsx
interface Props {
aA: boolean;
bB: string;
cC: '1' | '2';
}
const StyledDiv = styled.div<Props>`
background: ${({ aA }) => aA ? 'black' | 'white'};
// ...
`;
const Comp = ({ aA, bB, cC}: Props) => {
if (aA) {
// do something
} else {
// do something else
}
return <StyledDiv aA={aA} bB={bB} cC={cC}>{/*...*/}</StyledDiv>;
};
export default Comp;
// StyledComp.tsx
const StyledComp = styled(Comp)<{ dD: string, eE: number }>`
// ...
`;
export default StyledComp;
Qual é a melhor maneira de fazer isso? Estou pensando em criar outra interface DivProps
que espelhe Props
, mas com props transientes:
interface DivProps {
$aA: boolean;
$bB: string;
$cC: '1' | '2';
}
const StyledDiv = styled.div<DivProps>`
background: ${({ $aA }) => $aA ? 'black' | 'white'};
// ...
`;
Não gosto muito da ideia porque teria que atualizar ambos Props
e DivProps
se houver alguma mudança no futuro. Mas se essa for a única solução, então, por favor, me avise também. Obrigado!
Este é o caso de uso para a
shouldForwardProp
opção do.withConfig()
método:No seu caso:
Uma solução mais geral seria configurar um
shouldForwardProp
agradecimento global paraStyleSheetManager
:Veja também:
Se você estiver pronto para alterar a API do seu
StyledDiv
para usar o$
sinal para propriedades transitórias, mas quiser evitar ter que manter aDivProps
interface manualmente, você pode gerá-la automaticamente graças aos Tipos Mapeados e Remapeamento de Chaves do TypeScript :Demonstração: https://stackblitz.com/edit/react-ts-4dablowz?file=App.tsx
Eu diria que sua sugestão de ter uma "duplicata"
DivProps
é, na verdade, o caminho certo a seguir; isso é o que eu chamaria de "duplicação acidental".O problema é que há boas razões para que esses dois tipos sejam diferentes:
Props
descreve os adereços deComp
, então você deve usar os adereços e os tipos que fazem mais sentido para alguém que usa seuComp
componente,DivProps
descreve os props transitórios usados pelo próprio componente estilizado, então você deve usar os props e tipos que fazem mais sentido para alguém que escreve o CSS.Pode ser que eles sejam basicamente os mesmos em alguns casos, mas não necessariamente. Talvez você queira um prop adicional para
Comp
que seja usado para alternar entre diferentes componentes estilizados? Talvez você queira enviar um booleanoisSelected
paraComp
que será transformado em umbackgroundColor
? Talvez seu componente estilizado seja reutilizável fora deComp
e aceite mais props que você só quer codificar para valores específicos dentro deComp
.Há muitos motivos pelos quais você pode querer que eles sejam diferentes, então tentar reutilizar o mesmo tipo pode impedir que você melhore a API dos seus componentes no futuro.