Antes de mais nada o que é e como funciona a checagem de tipos com PropTypes
PropTypes é uma biblioteca do React que permite verificar o tipo dos componentes props antes da aplicação ser executada. Isso ajuda a encontrar erros de tipo em tempo de desenvolvimento, o que pode ajudar a evitar problemas de runtime. PropTypes é uma forma fácil de documentar e validar as propriedades que um componente precisa para funcionar corretamente.
Vantagens:
- Melhoria da documentação: PropTypes torna mais fácil para outros desenvolvedores entenderem como usar seu componente, pois eles podem ver quais propriedades são esperadas e quais tipos de dados são aceitos.
- Validação de tempo de desenvolvimento: Ao usar PropTypes, você pode encontrar erros de tipo antes da aplicação ser executada, o que é muito útil para evitar erros em produção.
- Melhoria da qualidade do código: Ao garantir que os componentes recebam as propriedades corretas, você pode ter certeza de que seu código será mais estável e confiável.
Desvantagens:
- Overhead de tempo de execução: Verificação de tipos através de PropTypes adiciona overhead de tempo de execução, pois as verificações são feitas em tempo de execução. Isso pode afetar o desempenho da aplicação em casos de uso intensivo.
- Não é garantido que todos os erros sejam detectados: Embora PropTypes seja uma ferramenta útil, ele não garante que todos os erros de tipo serão detectados. Alguns erros só serão descobertos em tempo de execução.
- Não é obrigatório: Embora PropTypes seja altamente recomendado, não é uma obrigação usá-lo. Alguns desenvolvedores optam por não usá-lo porque acham que o overhead de tempo de execução não vale a pena ou porque preferem outras abordagens de validação.
Exemplos de uso da checagem de tipos com PropTypes
Validando propriedades de um componente de função:
import React from 'react'; import PropTypes from 'prop-types'; function MyComponent(props) { return <div>{props.message}</div>; } MyComponent.propTypes = { message: PropTypes.string.isRequired, }; export default MyComponent;
Usando PropTypes com useState hook:
import React, { useState } from 'react'; import PropTypes from 'prop-types'; function Counter({ initialCount }) { const [count, setCount] = useState(initialCount); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); } Counter.propTypes = { initialCount: PropTypes.number, }; Counter.defaultProps = { initialCount: 0, }; export default Counter;
Usando PropTypes com useEffect hook:
import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; function FetchData({ url }) { const [data, setData] = useState(null); useEffect(() => { fetch(url) .then(response => response.json()) .then(data => setData(data)); }, [url]); return ( <div> {data === null ? ( 'Loading...' ) : ( <ul> {data.map(item => ( <li key={item.id}>{item.title}</li> ))} </ul> )} </div> ); } FetchData.propTypes = { url: PropTypes.string.isRequired, }; export default FetchData;
Tipos que contemplam os PropTypes
Os PropTypes fornecem vários tipos de validação que você pode usar para garantir que as propriedades recebidas por seus componentes do React estejam corretas:
PropTypes.array
: Valida que a propriedade é um array.PropTypes.bool
: Valida que a propriedade é um valor booleano (true
oufalse
).PropTypes.func
: Valida que a propriedade é uma função.PropTypes.number
: Valida que a propriedade é um número.PropTypes.object
: Valida que a propriedade é um objeto.PropTypes.string
: Valida que a propriedade é uma string.PropTypes.symbol
: Valida que a propriedade é um símbolo.PropTypes.node
: Valida que a propriedade é um nó do React, como uma string, elemento ou outro componente.PropTypes.element
: Valida que a propriedade é um elemento do React.PropTypes.instanceOf(Class)
: Valida que a propriedade é uma instância de uma determinada classe.PropTypes.oneOf(['value1', 'value2'])
: Valida que a propriedade é igual a uma das opções especificadas.PropTypes.oneOfType([PropTypes.string, PropTypes.number])
: Valida que a propriedade é um dos tipos especificados.PropTypes.arrayOf(PropTypes.number)
: Valida que a propriedade é um array de números.PropTypes.objectOf(PropTypes.number)
: Valida que a propriedade é um objeto com valores numéricos.PropTypes.shape({ key1: PropTypes.string, key2: PropTypes.number })
: Valida que a propriedade é um objeto com as chaves e tipos especificados.PropTypes.any
: Desabilita a validação de tipos para a propriedade.
Além disso, você pode adicionar o sufixo .isRequired
aos tipos de PropTypes para indicar que a propriedade é obrigatória. Se uma propriedade obrigatória não for fornecida, será gerado um aviso no console do navegador.
PropTypes Vs TypeScript
A pergunta que não quer calar, o uso da checagem de tipos com PropTypes é motivo para o não uso do TypeScript e vice-versa?
A resposta é… Não, o uso de PropTypes não conflita com o TypeScript. De fato, muitos desenvolvedores usam a checagem de tipos com PropTypes e TypeScript juntos em seus projetos do React, pois cada um oferece vantagens únicas.
PropTypes fornece validação de tipos em tempo de execução, enquanto o TypeScript fornece validação de tipos em tempo de compilação. Juntos, eles fornecem uma camada extra de segurança e ajudam a encontrar erros mais cedo na etapa de desenvolvimento.
Além disso, PropTypes pode ser útil para projetos existentes que já estão usando React e desejam adicionar validação de tipos sem fazer uma grande mudança para o TypeScript. Já para projetos novos, o TypeScript pode ser uma opção mais completa e avançada, já que oferece muitas outras vantagens, como inferência de tipos e tipos personalizados.
Em resumo, não há conflito entre o uso de PropTypes e TypeScript e os dois podem ser usados juntos em um projeto do React.