//
Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Configure um projeto React com TypeScript, com um tsconfig.json bem configurado, entenda como os arquivos .tsx funcionam e aprenda as anotações de tipo principais que todo desenvolvedor React precisa.
// tsconfig.json (Recomendado para Next.js 15 / React 19)
{
"compilerOptions": {
"target": "ES2022",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [{ "name": "next" }],
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}// src/components/Greeting.tsx
type GreetingProps = {
name: string;
age?: number;
};
export function Greeting({ name, age }: GreetingProps) {
return (
<div>
<h1>Olá, {name}</h1>
{age !== undefined && <p>Idade: {age}</p>}
</div>
);
}// Uso
<Greeting name="Alice" />
<Greeting name="Bob" age={30} />.tsx são arquivos TypeScript que suportam a sintaxe JSX. A configuração jsx: "preserve" informa ao TypeScript para deixar o JSX intocado para que o bundler (Next.js, Vite) o manipule.strict: true habilita uma família de verificações rigorosas (strictNullChecks, strictFunctionTypes, noImplicitAny, etc.) que detectam a maioria dos bugs.moduleResolution: "bundler" corresponde à forma como os bundlers modernos resolvem imports, suportando campos exports do package.json e imports sem extensão.@/* permitem que você escreva import { Button } from "@/components/Button" em vez de caminhos relativos frágeis.Configuração Vite + React:
{
"compilerOptions": {
"target": "ES2022",
"lib": ["ES2023", "DOM", "DOM.Iterable"],
"module": "ESNext",
"moduleResolution": "bundler",
"jsx": "react-jsx",
"strict": true,
"noEmit": true,
"isolatedModules": true,
"skipLibCheck": true
},
"include": ["src"]
}Adicionando opções mais rigorosas incrementalmente:
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,
"noFallthroughCasesInSwitch": true
}
}npm install -D @types/react @types/react-dom. Com o React 19, os tipos vêm com o react e @types/react podem não ser necessários dependendo da sua configuração.type para props e formas simples; use interface quando precisar de declaração de mesclagem ou extends.unknown em vez de any. Se você precisar usar any, adicione um comentário // eslint-disable e um TODO para corrigi-lo mais tarde."strict": true significa que o TypeScript não sinalizará o acesso a null ou undefined, anulando grande parte de seu valor.jsx como "react" em vez de "preserve" ou "react-jsx" força você a import React from "react" em cada arquivo.skipLibCheck: true é recomendado para velocidade de build, mas pode ocultar erros de tipo em seus próprios arquivos .d.ts.any desabilita silenciosamente a verificação de tipo para tudo o que esse valor toca downstream.| Abordagem | Prós | Contras |
|---|---|---|
strict: true desde o início | Detecta a maioria dos bugs cedo | Curva de aprendizado mais acentuada para iniciantes |
Adoção gradual (strict: false) | Migração mais fácil de JS | Perde bugs críticos de null/undefined |
Tipos JSDoc (sem arquivos .ts) | Mudanças zero no passo de build | Verboso, expressividade de tipo limitada |
interface para todas as props | Declaração de mesclagem, estilo OOP familiar | Não pode expressar uniões ou tipos mapeados |
type para todas as props | Uniões, interseções, tipos mapeados | Sem declaração de mesclagem |
strictNullChecks, noImplicitAny, strictFunctionTypes e outras verificações como um grupo."preserve" deixa o JSX intocado para que o bundler (Next.js, Vite) cuide da transformação."react-jsx" para projetos Vite + React que usam o runtime JSX automático."react" apenas se precisar da transformação clássica React.createElement (requer importar React em cada arquivo).type quando precisar de uniões, interseções ou tipos mapeados.interface quando precisar de declaração de mesclagem ou extends.type é suficiente e mais flexível.exports do package.json e imports sem extensão."node" ou "node16" para projetos empacotados.@types/react pode não ser necessário..tsx suportam a sintaxe JSX além do TypeScript..ts são para lógica pura de TypeScript sem JSX..tsx para qualquer arquivo que retorne ou contenha elementos JSX..d.ts, incluindo seus próprios arquivos de declaração personalizados..d.ts de terceiros também são ignorados silenciosamente.any desabilita silenciosamente a verificação de tipo para o valor e tudo o que ele toca downstream.unknown -- ele força você a restringir ou validar antes de acessar propriedades.any, adicione um comentário explicando o porquê e um TODO para corrigi-lo mais tarde.{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
}@/components/Button para ./src/components/Button.../../../components/Button.noUncheckedIndexedAccess adiciona | undefined ao acesso de índice de array e registro, capturando bugs de fora dos limites.exactOptionalPropertyTypes distingue entre uma propriedade ausente e uma definida como undefined.strict: true -- eles devem ser habilitados separadamente.type GreetingProps = {
name: string;
age?: number; // opcional
};
function Greeting({ name, age = 25 }: GreetingProps) {
return <p>{name} tem {age} anos</p>;
}? no tipo.undefined.Revisado por Chris St. John·Última atualização: 7 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥