Modo Estrito e Verificações do Compilador TypeScript
Ative as opções estritas do compilador TypeScript para capturar mais bugs em tempo de compilação e complementar o ESLint com segurança em nível de tipo.
Busque em todas as páginas da documentação
Ative as opções estritas do compilador TypeScript para capturar mais bugs em tempo de compilação e complementar o ESLint com segurança em nível de tipo.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Cartão de receita de referência rápida - pronto para copiar e colar.
# Verifica tipos sem emitir arquivos
npx tsc --noEmit
# Verifica tipos em modo de observação durante o desenvolvimento
npx tsc --noEmit --watch
# Adicionar ao package.json
# "type-check": "tsc --noEmit"Quando usar isso: Todo projeto TypeScript deve habilitar o modo estrito. A questão não é se, mas quão rapidamente você pode ativar cada opção.
// tsconfig.json
{
"compilerOptions": {
// --- Modo estrito (flag guarda-chuva) ---
"strict": true,
// "strict" habilita todas estas:
// "strictNullChecks": true,
// "strictFunctionTypes": true,
// "strictBindCallApply": true,
// "strictPropertyInitialization": true,
// "noImplicitAny": true,
// "noImplicitThis": true,
// "alwaysStrict": true,
// "useUnknownInCatchVariables": true,
// --- Verificações estritas adicionais (não incluídas em "strict") ---
"noUncheckedIndexedAccess": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noImplicitOverride": true,
"exactOptionalPropertyTypes": true,
// --- Configurações de Módulo e importação ---
"verbatimModuleSyntax": true,
"moduleResolution": "bundler",
"module": "esnext",
"target": "es2017",
// --- Aliases de caminho ---
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
},
// --- Saída ---
"noEmit": true,
"jsx": "preserve",
"incremental": true,
// --- Interop ---
"esModuleInterop": true,
"allowJs": true,
"resolveJsonModule": true,
"isolatedModules": true,
"skipLibCheck": true
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}O que isso demonstra:
strict completo habilitado como basestrict para segurança máximaverbatimModuleSyntax para imports explícitos apenas de tiponoUncheckedIndexedAccess para forçar verificações de nulo em acesso a arrays e objetosnoEmit, jsx: "preserve", moduleResolution: "bundler")"strict": true é uma flag guarda-chuva que habilita oito verificações estritas individuaisnoUncheckedIndexedAccess não estão incluídas em strict e devem ser habilitadas separadamentetsc --noEmit executa o verificador de tipos sem produzir arquivos de saída (o Next.js cuida da compilação via SWC)O que cada opção estrita captura:
| Opção | O que Captura |
|---|---|
strictNullChecks | Acesso a valores possivelmente null ou undefined sem verificação |
noImplicitAny | Variáveis ou parâmetros sem tipo que têm any como padrão |
strictFunctionTypes | Atribuições de tipo de parâmetro de função inseguras |
noUncheckedIndexedAccess | Acesso a array[i] ou obj[key] sem verificação de nulo |
noImplicitReturns | Funções que não retornam um valor em todos os caminhos de código |
noFallthroughCasesInSwitch | Falta de break ou return em casos de switch |
noImplicitOverride | Sobrescrita de métodos de classe base sem a palavra-chave override |
exactOptionalPropertyTypes | Atribuição explícita de undefined a propriedades opcionais |
verbatimModuleSyntax | Força import type para imports apenas de tipo |
Habilitando o modo estrito incrementalmente:
// Passo 1: Comece com strict false, mas habilite opções uma por uma
{
"compilerOptions": {
"strict": false,
"strictNullChecks": true, // Habilite primeiro - maior impacto
"noImplicitAny": true // Habilite em segundo
// Adicione mais conforme corrige os erros
}
}# Conta os erros restantes para acompanhar o progresso
npx tsc --noEmit 2>&1 | grep "error TS" | wc -lRegras do typescript-eslint que complementam o tsconfig:
// Estas regras do ESLint capturam padrões que o tsc não sinaliza:
{
rules: {
"@typescript-eslint/no-floating-promises": "error", // Promises não tratadas
"@typescript-eslint/no-misused-promises": "error", // Promises em contextos errados
"@typescript-eslint/await-thenable": "error", // await em algo que não é Promise
"@typescript-eslint/no-unnecessary-condition": "warn", // Condições sempre verdadeiras
"@typescript-eslint/prefer-nullish-coalescing": "warn", // || vs ??
"@typescript-eslint/strict-boolean-expressions": "warn", // Verificações de truthy em não-booleans
},
}Nota: Estas regras requerem parserOptions.project configurado para linting ciente de tipos.
// verbatimModuleSyntax força imports explícitos de tipo:
import type { User } from "@/types"; // Apenas tipo - apagado em tempo de execução
import { fetchUser } from "@/lib/api"; // Valor - mantido em tempo de execução
// noUncheckedIndexedAccess em ação:
const items = ["a", "b", "c"];
const first = items[0]; // Tipo: string | undefined (não string)
if (first) {
console.log(first.toUpperCase()); // Seguro - restrito para string
}
// Sem noUncheckedIndexedAccess:
const risky = items[0]; // Tipo: string (mentira - pode ser undefined)
risky.toUpperCase(); // Falha em tempo de execução se o array estiver vazioCoisas que vão te pegar. Cada armadilha inclui o que dá errado, por que acontece e a correção.
strictNullChecks cria muitos erros - Habilitar isso em um projeto existente grande pode produzir centenas ou milhares de erros. Correção: Habilite incrementalmente. Use // @ts-expect-error temporariamente para código conhecido como seguro e corrija os erros arquivo por arquivo.
noUncheckedIndexedAccess é barulhento - Cada array[i] e obj[key] se torna T | undefined, exigindo verificações de nulo mesmo quando você sabe que o valor existe. Correção: Use a asserção de não-nulo (items[0]!) com moderação onde você verificou que o valor existe, ou use .at(0) com uma verificação de nulo.
exactOptionalPropertyTypes quebra padrões comuns - Você não pode mais escrever { name?: string } e atribuir undefined a ele explicitamente. Correção: Habilite isso apenas se sua base de código distinguir entre propriedades "ausentes" e "explicitamente indefinidas". A maioria dos projetos pula esta opção.
Regras ESLint cientes de tipos são lentas - Regras como no-floating-promises requerem informações de tipo completas, tornando o ESLint 2 a 5 vezes mais lento. Correção: Habilite regras cientes de tipos apenas se o compromisso valer a pena. Considere executá-las apenas no CI, não no editor.
verbatimModuleSyntax e CommonJS - Esta opção não funciona bem com módulos CommonJS. Correção: Habilite-a apenas em projetos que usam módulos ES (o que inclui todos os projetos Next.js App Router).
Outras maneiras de resolver o mesmo problema - e quando cada uma é a melhor escolha.
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
strict: false com flags individuais | Migrando uma grande base de código de JavaScript para TypeScript | Iniciando um novo projeto (apenas use strict: true) |
| Apenas regras ESLint cientes de tipos | Você quer verificações de padrão sem alterar tsconfig | Você precisa de garantias em tempo de compilação |
// @ts-strict por arquivo | Você quer modo estrito em novos arquivos, mas não em código legado | Você pode habilitá-lo em todo o projeto |
Ele habilita oito flags individuais:
strictNullChecks, strictFunctionTypes, strictBindCallApply, strictPropertyInitializationnoImplicitAny, noImplicitThis, alwaysStrict, useUnknownInCatchVariablesstrictNullChecks -- tem o maior impacto e captura a maioria dos bugs reais.noImplicitAny em segundo.const items = ["a", "b", "c"];
const first = items[0]; // Tipo: string | undefined (não string)
if (first) {
console.log(first.toUpperCase()); // Seguro após a restrição
}Ele força verificações de nulo em cada acesso a índice de array e objeto.
array[i] e obj[key] se torna T | undefined.items[0]! com moderação para valores verificados, ou use .at(0) com uma verificação.import type explícito para imports apenas de tipo.npx tsc --noEmit 2>&1 | grep "error TS" | wc -lAcompanhe este número ao longo do tempo para medir o progresso da migração.
tsconfig capturam problemas em nível de tipo (segurança de nulo, any implícito, incompatibilidades de tipo).@typescript-eslint capturam padrões de código (promises flutuantes, condições desnecessárias, uso explícito de any).undefined a propriedades opcionais.no-floating-promises e no-misused-promises requerem informações de tipo completas.tsc --noEmit apenas verifica tipos sem produzir arquivos de saída.// @ts-expect-error -- conhecido como seguro, será corrigido em JIRA-123
const value = riskyFunction();@ts-expect-error temporariamente para código conhecido como seguro durante a migração incremental.@ts-ignore, ele gera um erro se o problema suprimido for corrigido (mantendo as supressões honestas).{
rules: {
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/no-misused-promises": "error",
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/prefer-nullish-coalescing": "warn",
}
}Estas capturam padrões que o tsc não sinaliza.
tsc --noEmit em CIRevisado por Chris St. John·Última atualização: 19 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥