TypeScript em RN: Boas Práticas
Um resumo condensado das 25 práticas recomendadas mais importantes, extraídas de todas as páginas desta seção.
Busque em todas as páginas da documentação
Um resumo condensado das 25 práticas recomendadas mais importantes, extraídas de todas as páginas desta seção.
Estenda expo/tsconfig.base: Projetos Expo SDK 57 devem começar com a configuração base oficial - ela inclui as configurações corretas de jsx, resolução de módulos e caminhos para tipagens de Metro e módulos nativos.
Ative strict para telas greenfield: Novos arquivos .tsx devem compilar com rigor total desde o primeiro dia; aplicativos brownfield ativam as flags incrementalmente, módulo por módulo, em vez de ativar tudo de uma vez.
Nomeie as props de cada componente: Exporte uma interface (ou tipo) ComponentNameProps ao lado do componente - tipos de objeto inline não escalam bem em refatorações e histórias do Storybook.
Prefira uniões discriminadas para variantes: Modele { variant: "a"; aField: string } | { variant: "b"; bField: number } em vez de campos opcionais em cada ramificação - o TypeScript faz o narrowing corretamente dentro de cada caso.
Evite React.FC em código novo: Digite o parâmetro da função diretamente - React.FC adiciona ruído implícito de children e é idiomaticamente depreciado em projetos React 19.
Reutilize tipos de props do RN com ComponentProps: Estenda primitivos via ComponentProps<typeof Pressable> e use Omit apenas para as chaves que você substitui - listas de props escritas manualmente se desviam quando o RN adiciona props de acessibilidade ou de plataforma.
Tipos de manipuladores de pressionamento a partir de PressableProps: Use PressableProps["onPress"] em vez de escrever manualmente assinaturas GestureResponderEvent que podem omitir parâmetros opcionais.
Envie genéricos para componentes de lista: Declare FlatList<Place> e SectionList<Place> no limite da lista - fazer casting de data as Place[] dentro de listas compartilhadas esconde erros do chamador.
Use readonly T[] para props de exibição: Evite que os chamadores modifiquem arrays que você renderiza - props são um contrato, não um buffer compartilhado mutável.
Habilite rotas tipadas do Expo Router: Defina experiments.typedRoutes: true em app.config e inclua .expo/types/**/*.ts para que Href e router.push capturem caminhos inválidos em tempo de compilação.
Regenere tipos de rota em CI: Execute npx expo customize tsconfig.json antes de tsc --noEmit - sem tipos gerados, todo href degrada para string.
Passe rotas dinâmicas como hrefs de objeto: Use { pathname: "/user/[id]", params: { id } } - literais de string como "/user/[id]" falham nas verificações de rota tipada porque os parâmetros estão ausentes.
Combine os nomes dos colchetes exatamente: Um arquivo [id].tsx requer params: { id }, não { userId } - as chaves de parâmetro devem espelhar o segmento do sistema de arquivos.
Valide parâmetros de URL com Zod: Rotas tipadas provam a forma do caminho, não a segurança do valor - analise a saída de useLocalSearchParams antes de usar IDs em chamadas de fetch.
Trate JSON de fetch como unknown: res.json() não valida - atribua a unknown, depois Schema.parse(data); nunca as MyInterface na fronteira.
Modele envelopes de API explicitamente: Analise wrappers { items, nextCursor }, não arrays puros - backends adicionam campos de paginação sem um major version bump.
Use .nullable() para nulls de SQL: Backend avatarUrl: null falha esquemas .optional() - distinga chaves ausentes (opcional) de nulls presentes (nullable).
Converta números na fronteira: Gateways às vezes transformam campos numéricos em string - z.coerce.number() pertence ao esquema Zod, não a chamadas repetidas de Number() em telas.
Tipos de estilos como StyleProp<ViewStyle>: Chamadores precisam passar arrays de estilos e guardas falsy - ViewStyle puro rejeita [styles.base, pressed && styles.active].
Use PressableProps["style"] para wrappers de pressionamento: Estilos de Pressable podem ser funções do estado pressed - fazer narrowing para ViewStyle quebra a forma de callback.
Envolva módulos nativos com requireNativeModule tipado: Declare uma interface NativeModule e analise retornos assíncronos com Zod - bindings JSI ainda podem retornar formas inesperadas entre versões do SO.
Use requireOptionalNativeModule em caminhos do Expo Go: Módulos ausentes no Expo Go devem degradar graciosamente - require opcional mais feature flags é melhor que try/catch em torno de cada chamada.
Fase a rigorosidade em aplicativos brownfield: Habilite noImplicitAny, depois strictNullChecks, depois strict - uma flag por sprint mantém os PRs revisáveis.
Prefira @ts-expect-error em vez de @ts-ignore: expect-error falha quando o erro subjacente é corrigido - comentários ignore persistem e escondem regressões reais.
Verifique tipos em CI separadamente do lint: Execute tsc --noEmit em cada PR - ESLint não captura hrefs de rota inválidos, incompatibilidades Zod ou inferência genérica quebrada.
style?: ViewStyle por style?: StyleProp<ViewStyle> em componentes compartilhados.ComponentProps<typeof Pressable>, omita children se você o renomear, e espalhe ...pressableProps por último apenas quando os chamadores devem substituir os padrões.expo customize tsconfig.json.strictNullChecks - ela expõe a maioria dos bugs reais, mas também o maior ruído legado.noImplicitAny em novos módulos primeiro.tsconfig estrito e exemplos tipados introdutóriosHref gerados e configuração de CIVersões da Stack: Esta página foi escrita para React 19.2.3, React Native 0.86.0 e Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026