Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Qual o sentindo do erro de incompatibilidade no componente Time ?

No meu código, ao mudar o arquivo app.js para app.tsx, não apareceu o erro de incompatibilidade do componente Time que apareceu no vídeo. Mesmo assim, estou curioso para entender o motivo e o que ocasionou o erro. Seria pelo fato de um componente com extensão .tsx não ser capaz de retornar uma string, ou pelo fato de que o mesmo componente poderia retornar um JSX ou uma string, e esses retornos diferentes ocasionaram o erro? Não consegui entender realmente o sentido. Se alguém puder me ajudar, ficarei grato.

2 respostas
solução!

Olá Pedro, tudo bem?

No exemplo do vídeo, o erro de incompatibilidade ocorre porque o componente Time pode retornar dois tipos diferentes: um JSX ou uma string vazia. O TypeScript é mais rigoroso com tipos do que o JavaScript, e ele espera que a função de um componente sempre retorne um tipo consistente.

No caso específico do componente Time, o código original tinha algo assim:

const Time = (props: TimeProps) => {
    const css = { backgroundColor: props.corSecundaria }

    return (
        (props.colaboradores.length > 0) ? <section className='time' style={css}>
            <h3 style={{ borderColor: props.corPrimaria }}>{props.nome}</h3>
            <div className='colaboradores'>
                {props.colaboradores.map(colaborador => 
                    <Colaborador 
                        corDeFundo={props.corPrimaria} 
                        key={colaborador.nome} 
                        nome={colaborador.nome} 
                        cargo={colaborador.cargo} 
                        imagem={colaborador.imagem}
                    /> )}
            </div>
        </section> 
        : ''
    )
}

Aqui, se props.colaboradores.length for maior que 0, ele retorna um JSX. Caso contrário, retorna uma string vazia ''. Esse comportamento é o que causa o erro de incompatibilidade, pois o TypeScript não aceita que uma função possa retornar tipos diferentes.

Pra resolver isso, como mencionado no vídeo, podemos usar um React Fragment, que é uma solução elegante para retornar um JSX vazio sem adicionar elementos desnecessários ao DOM. Veja como ficaria:

const Time = (props: TimeProps) => {
    const css = { backgroundColor: props.corSecundaria }

    return (
        (props.colaboradores.length > 0) ? <section className='time' style={css}>
            <h3 style={{ borderColor: props.corPrimaria }}>{props.nome}</h3>
            <div className='colaboradores'>
                {props.colaboradores.map(colaborador => 
                    <Colaborador 
                        corDeFundo={props.corPrimaria} 
                        key={colaborador.nome} 
                        nome={colaborador.nome} 
                        cargo={colaborador.cargo} 
                        imagem={colaborador.imagem}
                    /> )}
            </div>
        </section> 
        : <></>
    )
}

Ao usar <></>, estamos retornando um React Fragment, que é tratado como um JSX válido, e assim, o TypeScript não reclama de tipos incompatíveis.

Espero ter ajudado.

Um abraço e bons estudos.

Agora siim, muito obrigado Lorena pela ajuda!