Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

395
Views
Uso de accesorios polimórficos 'como' de componentes con estilo con mecanografiado

Estaba tratando de implementar un componente de reacción de Typography.
Como puede ver a continuación, obtuve la variante como accesorio de entrada y la usé como índice del objeto VariantsMap para obtener el nombre de etiqueta html correspondiente.

Luego usé componentes polimórficos 'como' con estilo para representarlo como una etiqueta html seleccionada.

pero sigo recibiendo este error:
No overload matches this call. Overload 1 of 2, '(props: Omit<Omit<Pick<DetailedHTMLProps<HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "key" | keyof HTMLAttributes<...>> & { ...; } & { ...; }, never> & Partial<...>, "theme"> & { ...; } & { ...; }): ReactElement<...>', gave the following error. Type 'string' is not assignable to type 'undefined'.

Encontré en @types/styled-component que los accesorios 'as' pueden ser 'nunca | indefinido', y mi varianteMap devuelve el tipo de cadena.
Pero realmente quiero usar este accesorio 'como' con mi función de selección de etiquetas html específica de variante.

¿Hay alguna manera de resolver este problema?

 const variantMap = { h1: 'h1', h2: 'h2', h3: 'h3', h4: 'h4', h5: 'h5', h6: 'h6', subheading1: 'h6', subheading2: 'h6', body1: 'p', body2: 'p', }; export const Typography = ({ variant : string }) => { const selectedComponent = variantMap[variant]; return (<TypographyRoot as={selectedComponent} variant={variant} {...props} > {children} </TypographyRoot>); }
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

En primer lugar, export const Typography = ({ variant : string }) => {} no es una sintaxis válida.

Acaba de cambiar el nombre de la variant desestructurada a string . No proporcionaste un tipo.

La razón por la que tiene un error incluso con un tipo de string válido como aquí export const Typography = ({ variant }:{variant: string}) => {} es que variantMap espera como clave h1 | 'h2' |'h3' ... teclas mientras que la string es mucho más ancha. Apuesto a que no desea asignar foo string a la propiedad variant .

Para solucionarlo, solo necesita hacer que variantMap sea inmutable y aplicar la restricción adecuada a variantMap :

 import React from 'react' import styled from "styled-components"; const Div = styled.div` color: red; `; const VariantMap = { h1: 'h1', h2: 'h2', h3: 'h3', h4: 'h4', h5: 'h5', h6: 'h6', subheading1: 'h6', subheading2: 'h6', body1: 'p', body2: 'p', } as const; type Props = { variant: keyof typeof VariantMap } export const Typography = ({ variant }: Props) => { const selectedComponent = VariantMap[variant]; return <Div as={selectedComponent} /> }

Ahora styled-component está feliz.

Patio de juegos


Hacer el mapa inmutable me salvó. ¿Puede explicar por qué no hacer que el mapa sea inmutable hace que Typescript se queje?

Sin as const todos los valores de VariantMap se deducen como una string en lugar de los literales "h1", "h2" . Lo que a su vez afecta a selectedComponent , ya que esta const representa un valor de VariantMap . Me refiero a que el componente selectedComponent se convierte en una string normal en lugar de una cadena literal, mientras as propiedad espera una cadena literal estricta h1, h2, h3, ...

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!