React+TypeScript Cheatsheets em Português

Cheatsheets para desenvolvedores com experiência em React que estão iniciando com TypeScript
Web docs | 中文翻译 | Español | Contribute! | Ask!
Todas as dicas de React + TypeScript
- Cheatsheet Básico (
/README.md
) é focado em ajudar desenvolvedores React a começar a usar TS com React apps- Foco nas melhores práticas com exemplos para copiar e colar.
- Explica alguns tipos básicos de uso de TS e configuração ao longo do caminho.
- Responde às perguntas mais frequentes.
- Não cobre a lógica de tipo genérico em detalhes. Em vez disso, preferimos ensinar técnicas de solução de problemas simples para iniciantes.
- O objetivo é se familiarizar com TS sem precisar aprender muito sobre TS.
- Cheatsheet Avançado (
/AVANÃADO.md
) ajuda a mostrar e explicar o uso avançado de tipos genéricos para pessoas que escrevem utilitários/funções/props de renderização/componentes de ordem superior (HOCs) reutilizáveis ââe bibliotecas TS+React.- Possui dicas e truques diversos para usuários profissionais.
- Conselhos para contribuir com DefinitelyTyped.
- O Objetivo é tirar total vantagem sobre o TypeScript.
- Cheatsheet de migração (
/MIGRANDO.md
) ajuda a reunir conselhos para a migração incremental de grandes bases de código de JS ou Flow, de pessoas que já fizeram isso.- Nós não tentamos convencer as pessoas a mudar, apenas ajudar as pessoas que já decidiram isso.
â ï¸? Esta é uma nova cheatsheet, toda ajuda é bem-vinda.
- Cheatsheet de HOCs (
/HOC.md
) especificamente ensina as pessoas a escrever HOCs com a ajuda de exemplos.- Familiaridade com Genéricos é necessário.
â ï¸? Esta é uma nova cheatsheet, toda a assistência é bem-vinda.
Tabela de conteúdos da Cheatsheet básica
Expandir Tabela de Conteúdo
- Seção 2: Primeiros Passos
- Componente de Função
- Hooks
- useState
- useReducer
- useEffect
- useRef
- useImperativeHandle
- Hooks Customizados
- Componentes de Classe
- Talvez você não precise do
defaultProps
- "Tipando"
defaultProps
- Consumindo Props de um Componente com defaultProps
- Discussões e Conhecimentos Diversos
- Tipos ou Interfaces?
- Exemplos básicos do tipo Prop
- Exemplos úteis do tipo React Prop
- getDerivedStateFromProps
- Formulários e Eventos
- Context
- Exemplo Básico
- Exemplo Extendido
- forwardRef/createRef
- Portais
- Limites de erros
- Concurrent React/React Suspense
- Manual de resolução de problemas: Tipos
- Tipos de União e Tipos de Proteção
- Tipos Opcionais
- Tipos de Enum
- Tipos de Asserção
- Simulando Tipos Nominais
- Tipos de Interseção
- Tipos de União
- Sobrecarregando Tipos de Função
- Usando Tipos Inferidos
- Usando Tipos Parciais
- Os Tipos de que preciso não foram exportados!
- Os Tipos de que preciso não existem!
- Manual de resolução de problemas: Operadores
- Manual de resolução de problemas: Utilitários
- Manual de resolução de problemas: tsconfig.json
- Manual de resolução de problemas: Erros en tipos oficiais
- Bases de código de React + TypeScript recomendadas para aprender
- Ferramentas e integração em editores
- Linting
- Outros recursos sobre React + TypeScript
- Discussões recomendadas sobre React + TypeScript
- Hora de realmente aprender TypeScript
- Aplicação de Exemplo
- Minha pergunta não foi respondida aqui!
Seção 1: Configuração
Pré-requisitos
- Uma boa compreensão de React.
- Familiaridade com os tipos básicos de TypeScript ( O guia de 2ality é de grande ajuda. Se você é completamente novato em TypeScript, dê uma olhada no tutorial de chibicode ).
- Ter lido a seção de TypeScript na documentação oficial do React.
- Ter lido a seção do React do novo playground de TypeScript ( Opcional: também acompanhar os mais de 40 exemplos na seção de exemplos do playground ).
Este guia sempre assumirá que você está usando a última versão de Typescript. Notas para versões mais antigas usarão a etiqueta <details>
.
Ferramentas iniciais de React + TypeScript
Configurações na nuvem:
- Playground do TypeScript com React apenas se você estiver depurando tipos (e relatando problemas), não para executar código.
- CodeSandbox - IDE na nuvem, inicializa super rápido.
- Stackblitz - IDE na nuvem, inicializa super rápido.
Configurações de desenvolvimento local:
- Next.js:
npx create-next-app -e with-typescript
irá criar no seu diretório atual. - Create React App:
npx create-react-app name-of-app --template typescript
irá criar em um novo diretório. - Meteor:
meteor create --typescript name-of-my-new-typescript-app
- Ignite para React Native:
ignite new myapp
- TSDX:
npx tsdx create mylib
para Creating React+TS libraries
Outras ferramentas
Ferramentas menos maduras mas que vale a pena conferir:
- Vite:
npm init vite-app my-react-project --template react-ts
(nota - ainda não está na versão v1.0, mas é muito rápida). - Snowpack:
npx create-snowpack-app my-app --template app-template-react-typescript
- Docusaurus v2 com suporte a TypeScript
- Parcel
- JP Morgan's
modular
: CRA + TS + Yarn Workspaces toolkit.yarn create modular-react-app <project-name>
Manual de configuração:
- O guia de Basarat para uma configuração manual de React + TypeScript + Webpack + Babel.
- Em particular, certifique-se de ter instalado
@types/react
e@types/react-dom
.( Leia mais sobre o projeto DefinitelyTyped caso você não esteja familiarizado ). - Existem também muitos boilerplates de React + Typescript. Por favor consulte nossa lista de outros recursos.
Import React
import * as React from 'react';
import * as ReactDOM from 'react-dom';
Este é o caminho mais seguro no futuro para importar React. Se você definir --allowSyntheticDefaultImports
(ou adicionar "allowSyntheticDefaultImports": true
) em seu tsconfig.json
, você poderá importar como se faz normalmente em jsx:
import React from 'react';
import ReactDOM from 'react-dom';
Explicação
Por que usar allowSyntheticDefaultImports
ao invés de esModuleInterop
? Daniel Rosenwasser comentou que é melhor para webpack/parcel. Para consultar mais argumentos dessa discussão https://github.com/wmonk/create-react-app-typescript/issues/214
Você também deveria verificar a nova documentação do TypeScript para descrições oficiais entre cada flag do compilador!
Seção 2: Primeiros Passos
Componente de Função
Podem ser escritos como funções normais que recebem props
como argumento e retornam um elemento JSX.
type AppProps = { message: string }; /* também se pode usar uma interface */
const App = ({ message }: AppProps) => <div>{message}</div>;
Por que `React.FC` é desencorajado? E sobre `React.FunctionComponent` / `React.VoidFunctionComponent`?
Você pode ver isso em muitas bases de código React + TypeScript:
const App: React.FunctionComponent<{ message: string }> = ({ message }) => (
<div>{message}</div>
);
No entanto, o consenso geral hoje é que o uso de React.FunctionComponent
(ou a abreviação React.FC
) é [desencorajado] (https://github.com/facebook/create-react-app/pull/8177). Isto é um ponto de vista, é claro, mas se você concorda e deseja remover React.FC
da sua base de código, você pode usar [este jscodeshift codemod] (https://github.com/gndelia/codemod-replace-react- fc-typescript).
Algumas diferenças da versão de "função normal":
-
React.FunctionComponent
é explÃcito sobre o tipo de retorno, enquanto a versão normal da função é implÃcita (ou então precisa de anotações adicionais). -
Fornece verificação de tipos e preenchimento automático para propriedades estáticas como
displayName
,propTypes
edefaultProps
.- Observe que existem alguns problemas conhecidos usando
defaultProps
comReact.FunctionComponent
. Consulte [este problema para obter detalhes] (https://github.com/typescript-cheatsheets/react-typescript-cheatsheet/issues/87). Nós mantemos uma seçãodefaultProps
separada para que você também possa consultar.
- Observe que existem alguns problemas conhecidos usando
-
Fornece uma definição implÃcita de
children
(veja abaixo) - no entanto, há alguns problemas com o tipochildren
implÃcito (por exemplo, DefinitelyTyped#33006), e é melhor ser explÃcito sobre os componentes que consomemchildren
, de qualquer maneira.
const Title: React.FunctionComponent<{ title: string }> = ({
children,
title,
}) => <div title={title}>{children}</div>;
Usando `React.VoidFunctionComponent` ou` React.VFC` como alternativa
A partir da versão [@types/react 16.9.48] (https://github.com/DefinitelyTyped/DefinitelyTyped/pull/46643), você também poderá usar o tipo React.VoidFunctionComponent
ou React.VFC
se quiser tipar children
explicitamente. Esta é uma solução provisória até que FunctionComponent
não aceite nenhum children
por padrão (planejado para @types/react@^18.0.0
).
type Props = { foo: string };
// OK agora mas futuramente causará erro
const FunctionComponent: React.FunctionComponent<Props> = ({
foo,
children,
}: Props) => {
return (
<div>
{foo} {children}
</div>
); // OK
};
// OK agora mas futuramente se tornará obsoleto
const VoidFunctionComponent: React.VoidFunctionComponent<Props> = ({
foo,
children,
}) => {
return (
<div>
{foo}
{children}
</div>
);
};
Na maioria dos casos, faz pouca diferença qual sintaxe é usada, mas você pode preferir a natureza mais explÃcita de React.FunctionComponent
.
Problemas menores
Esses padrões não são suportados:
** Renderização condicional **
const MyConditionalComponent = ({ shouldRender = false }) =>
shouldRender ? <div /> : false; // tampouco faça isso em JS
const el = <MyConditionalComponent />; // gera um erro
Isso ocorre porque, devido às limitações do compilador, os componentes de função não podem retornar nada além de uma expressão JSX ou null
, caso contrário, ele reclama com uma mensagem de erro enigmática dizendo que outro tipo não pode ser atribuÃdo ao Elemento.
const MyArrayComponent = () => Array(5).fill(<div />);
const el2 = <MyArrayComponent />; // gera um erro
Array.fill
Infelizmente, apenas anotar o tipo de função não vai ajudar, então se você realmente precisar retornar outros tipos exóticos que o React suporta, será necessário executar uma declaração de tipo:
const MyArrayComponent = () => (Array(5).fill(<div />) as any) as JSX.Element;
[Veja o comentário de @ferdaber aqui] (https://github.com/typescript-cheatsheets/react-typescript-cheatsheet/issues/57).