Promises como props para um componente do React usando typescript

Gabriel Eduardo de Lima Machado
3 min readMar 14, 2021

É comum no desenvolvimento web ter que fazer chamadas para um servidor para carregar determinado conteúdo. Texto, imagens, vídeos… O javascript tem o recurso de Promises, que é bastante útil nestes casos. Nesse artigo vou expor uma abordagem para lidar com Promises e Componentes do React (com typescript).

Imagine que você tem um componente que recebe como props um array de urls de imagens e faz qualquer coisa com elas, algo do tipo

Esse componente pode funcionar perfeitamente, mas ele é preparado para lidar com um array de strings. E se você tivesse que pegar esse array de um servidor? Bom você poderia usar o useState para contornar a chamada.

Tudo bem, não parece tão ruim. Não mudou muuuita coisa. Mas agora seu componente precisa dessas promises. E pior, ele tem sideEffects, nem é um componente puro mais.

Restaurando a pureza

E se pudéssemos apenas transformar o nosso componente original em um outro igualzinho mas que aceita uma Promise contendo um array de strings?

Em outras palavras, se eu tenho um componente com props do tipo T, será que não há uma forma de transformá-lo em um que aceite props do tipo Promise<T>?

Para construir algo desse tipo podemos criar uma função do tipo

Algo muito bom do typescript é que ele nos permite pensar em alto nível sobre o que queremos fazer, sem ter que completar a implementação primeiro. Bom, isso é justamente o que precisamos. A função recebe um componente qualquer e retorna um outro que recebe as mesmas props, mas involucradas numa Promise. Só que tem um problema com isso, para passarmos props pra um componente do JSX, precisamos que elas tenham nome. Não tem como simplesmente passar Promise<string[]> pra um componente, ela precisa ter um nome, então falta envolvê-la num objeto.

Ok, agora ela funciona.

Implementação

Enquanto a promise não resolve, precisamos mostrar algo, você pode até implementar um valor de fallback personalizado, mas neste caso, retornarmos apenas uma div vazia.

Se observarmos bem, essa função faz exatamente o que faríamos para resolver cada caso individual, mas ela generaliza para todos os casos de transformação de um componente. E como poderíamos usar esse componente? Da seguinte maneira

PDisplay recebe todas as props de verdade em pProps, que é a prop de mentira. Enquanto a promise não resolve, ele mostra na tela a div vazia, assim que ela resolve, ele mostra o componente normal como seria antes.

--

--