No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
8 Hrs
45 Min
43 Seg

El objeto props y children

5/16
Recursos

Aportes 7

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Any es el demonio vale ☺

Mis Apuntes

Para poder usar las props con TSX primero tenemos que tipar el objeto de props. Lo hacemos asignándole un tipo por cada prop que tengamos, y para hacerlo mas mantenible, separamos esos tipos en un objeto aparte (ya sea con type o interface).

// RandomFox.tsx
type Props = {
  image: string;
  alt: string;
	// another prop
};
export const RandomFox = ({ image, alt }: Props): JSX.Element => {
// Lo que hicimos fue desestructurar el objeto props para 
// quedarnos solo con lo que necesitamos (image y alt)
  return (
    <img width={320} height='auto' src={image} alt={alt} className='rounded' />
  );
};

Nota: En dado caso de que queramos añadir una nueva prop, hay que definirle su tipo o sino TS nos da un error

// index.tsx
import { NextPage } from 'next';
import Head from 'next/head'
import { RandomFox } from '@/components/RandomFox';

const random = (): number => Math.floor(Math.random() * 123) + 1;

const Home: NextPage = () => {
  return (
    <>
      <Head>
        <title>React con TypeScript</title>
        <meta name="description" content="Generated by me" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="icon" href="/favicon.ico" />
      </Head>
      <main>
        <RandomFox alt='zorrito' image={`https://randomfox.ca/images/${random()}.jpg`} />
				{/* Si tenemos que mandar otra prop hay que definirla en nuestro tipo Props */}
      </main>
      <footer>
				El mejor footer de la historia
      </footer>
    </>
  )
}

export default Home;

Enemigo: Any

Recuerden que any es el enemigo🤣

Any = PELIGRO!!!

CÓMO TIPAR UN CHILDREN:
https://blog.logrocket.com/using-react-children-prop-with-typescript/

Recordemos que children es una propiedad que viene dentro del objeto prop
EJEMPLO 1:

Aquí vemos que le paso la etiqueta <figcaption> como children a <RandomFox>

import { RandomFox } from '@/components/RandomFox';

const randomNum = ()=> Math.floor(Math.random()*123 + 1);

export default function Home() {
  return (
    <div>
      <main>
        <p>Chikorita Papu!!</p>
        <RandomFox img={randomNum()}>
          <figcaption>Fox image</figcaption> //children
        </RandomFox>
      </main>

    </div>
  )
}

Ahora veamos el componente como se ve:

Vemos que, usando un alias creo el type props y este guarda la propiedad img y la propiedad children; img es tipado como number en mi caso y children es tipado como JSX.Element. De esta manera no obtenemos error.

type props = {
    img: number;
    children: JSX.Element;
}

function RandomFox({img, children}: props ) : JSX.Element{
    return (
        <figure>
            <img src={`https://randomfox.ca/images/${img}.jpg`} alt="fox img"
                width={320} height={"auto"} className="mt-3"/>
            {children}
        </figure>
       
    )
}
export {RandomFox}

¿Y si queremos más de un hijo? Recordemos que más hijos forman un array de hijos.

<RandomFox img={randomNum()}>
          <figcaption>Fox image</figcaption>
          <p>Other child</p>
  </RandomFox>

En el componente sólo debemos decir que queremos que nuestro children admita también un array de JSX.Element.

type props = {
    img: number;
    children: JSX.Element | JSX.Element[]; 
}

function RandomFox({img, children}: props ) : JSX.Element{
    return (
    
        <figure>
            <img src={`https://randomfox.ca/images/${img}.jpg`} alt="fox img"
                width={320} height={"auto"} className="mt-3"/>
            {children}
        </figure>
       
    )
}
export {RandomFox}

Al menos así entendí como se debe hacer, espero correcciones si son necesarias.

Hay dos formas para poder enviar los props, sin embargo el tiparlo es la más recomendada y fácil de mantener.

  1. Está es la forma recomendada y estándar, ya que es más especifica.

    type Props = {
      image: string,
    }
    
    // destructing de las props es mejor
    export const RandomFox = ({image}: Props): JSX.Element => {
        return (
        <img src={image} width="420" height='auto' className="rounded" />
      )
    }
    
  2. Aún no es la recomendada es otra opción.

    type Props = {
      image: string,
    }
    
    export const RandomFox = (props: Props): JSX.Element => {
        return (
        <img src={props.image} width="420" height='auto' className="rounded" />
      )
    }
    
  3. Está es otra forma pero no se recomienda su uso ya que es díficil de mantener.

    export const RandomFox = (props: {image: string}): JSX.Element => {;
        return (
        <img src={props.image} width="420" height='auto' className="rounded" />
      )
    }