1
resposta

Código com erro children

Bom, estou tentando aprender seguindo os passo do professor quando coloco o "props.children" que era pra funcionar mas não funciona. alguem sabe o por que?

Compiled with problems:X

ERROR in src/components/botao/index.tsx:8:19

TS2339: Property 'children' does not exist on type 'Readonly<{}>'.
     6 |     return(
     7 |       <button className={style.botao}>
  > 8 |       {this.props.children}
        |                             ^^^^^^^^
     9 |       </button>
   10 |     )
   11 |   }

import React from "react";
import style from './botao.module.scss';

class Botao extends React.Component {
  render(){
    return(
      <button className={style.botao}>
      {this.props.children}
      </button>
    )
  }
}
export default Botao;
1 resposta

Oi Alexandre, tudo bem?

Desculpe a demora em retornar.

Entendo que pode ser frustrante quando o código não funciona como deveria, mas vamos tentar entender o que está acontecendo.

Pelo erro apresentado, podemos ver que o problema está na linha 8 do arquivo botao/index.tsx, mais especificamente na propriedade children de this.props. O erro diz que a propriedade children não existe no tipo Readonly<{}>, ou seja, o TypeScript não reconhece a propriedade children nessa classe.

Uma possível solução para esse problema seria definir um tipo para as propriedades da classe Botao. Você pode fazer isso utilizando a interface Props (ou outro nome de sua escolha), por exemplo:

interface Props {
  children: React.ReactNode;
}

class Botao extends React.Component<Props> {
  render() {
    return (
      <button className={style.botao}>
        {this.props.children}
      </button>
    )
  }
}

Nessa definição, estamos indicando que a classe Botao tem uma propriedade children do tipo React.ReactNode. O React.ReactNode é um tipo genérico do TypeScript que aceita qualquer coisa que possa ser renderizada pelo React, incluindo strings, números, componentes e elementos.

Outra alternativa seria usar o React.FC, que é uma abreviação de "Function Component". Com o React.FC, não precisamos criar uma interface para as propriedades, pois ela já é inferida pelo TypeScript. O código ficaria assim:

const Botao: React.FC = ({ children }) => (
  <button className={style.botao}>
    {children}
  </button>
);

Nesse caso, estamos definindo uma constante Botao do tipo React.FC, que recebe as propriedades desestruturadas (no caso, só children) e retorna o JSX com o botão.

Espero que essa explicação tenha sido útil e clara para você.

Um abraço e bons estudos.